第一前提として、スロークエリーのログを保存できるようにしておく。
log-slow-queries=/mnt/log/mysql-slow.log
long_query_time=5
log-queries-not-using-indexes

これは、自分の環境だけなのか mysql-slow.log を予め作っておく必要がある。
mySQLが勝手に生成してくれない。
今も謎。仕様?
# mkdir /mnt/log/mysql-slow.log
# chmod 666 /mnt/log/mysql-slow.log

ログローテーションで使うのでrootのアイパスをmy.cnfに追記しておく。
[mysqladmin]
password = "hogehoge"
user = root

そしてmysqldを再起動。

設定ファイルのテンプレートがyumでmySQLをいれたら入ってたのでそれを利用

# cp /usr/local/mysql/share/mysql/mysql-log-rotate /etc/logrotate.d/

/mnt/log/mysql-slow.log {
notifempty
daily
rotate 3
missingok
compress
postrotate
# just if mysqld is really running
touch /mnt/log/mysql-slow.log
chmod 666 /mnt/log/mysql-slow.log
if test -x /usr/local/mysql/bin/mysqladmin && \
/usr/local/mysql/bin/mysqladmin ping &>/dev/null
then
/usr/local/mysql/bin/mysqladmin flush-logs
fi
endscript
}

上記のようなログファイルが生成されないという問題があるので、無理やりファイルを作ってローテーションする。

そもそもローテーションしないといけないくらいログが溜まること自体問題なのだけど、1ファイルがでかくなり過ぎるのは精神衛生上もよくないので一応やっておく。

8月 19th, 2010mmeasure

mmeasureはmySQLの負荷を監視、チューニングのアドバイスを提供してくれるツールです。
今まで知らなかったけど、けっこう古いツールです。
そのままだとmySQL5.1以上は動きません。

cactiでもお馴染のグラフ生成に必要なrrdtoolをインストール
# yum install rrdtool

mmeasureの最新版をダウンロード&展開
# cd /usr/local
# wget http://prdownloads.sourceforge.jp/mmeasure/18557/mmeasure-1.0.7.tar.gz
# tar xvzf mmeasure-1.0.7.tar.gz

mmeasure.confを修正する
# cp mmeasure_template.conf mmeasure.conf

このテンプレートがデフォルトでは設定項目が足りなくて動かないという頑固者。
生成する画像の設定
WEBDIR="$PATH_MMEASURE/web/images/graphs"
WIDTH="400"
WIDTH_SMALL="400"
WIDTH_LARGE="400"
HEIGHT="100"
HEIGHT_SMALL="100"
HEIGHT_LARGE="100"
IMAGEFORMAT="gif"

rrdtoolのパスを変更
PATH_RRDTOOL="/usr/bin/rrdtool"

mySQL関連の設定を変更
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=hogehoge
#MYSQL_PORT=3306
#MYSQL_SOCKET=/tmp/mysql.sock
MYSQL_SLOW_QUERY_LOG="/mnt/log/mysql-slow.log" # なければmy.iniで設定する

mySQL5.1だと起動はするものの数分したらコケるので下記のように男らしく修正
原因はtable_cacheがtable_open_cacheという名前に変わった為。
参考: mmeasuer 1.0.7を無理矢理mysql 5.1に対応させる
find /usr/local/mmeasure/ -type f -print0 | xargs -0 grep -l --null table_cache | xargs -0 perl -i.bak -p -e 's/table_cache/table_open_cache/g;'

同じような原因で、総クエリー回数以下の値を取得できないので、show statusをshow global statusにかえてやる。
find /usr/local/mmeasure/ -type f -print0 | xargs -0 grep -l --null table_cache | xargs -0 perl -i.bak -p -e 's/show status/show global status/g;'

これでmmeasure本体の設定は完了。

続いて、webで表示させるツールなのでhttpdも修正
/etc/httpd/conf.d/mmeasure.conf を作成

Alias /mmeasure/ "/usr/local/mmeasure/web/"
<Directory /usr/local/mmeasure/web/>
AuthUserFile /usr/local/mmeasure/web/.htpasspwd
AuthGroupFile /dev/null
AuthName "User Verification"
AuthType Basic
require valid-user
AddDefaultCharset euc-jp
</Directory>

mmeasure.shを起動
/usr/local/mmeasure/daemon/mmeasure.sh start

mmeasure.shを再起動
/etc/init.d/httpd restart

http://hogehoge.com/mmeasure/ にアクセスするとページが表示される。

注意点として、
「過去のインデックス未使用クエリー内訳」にページャーとかがついてるわけでないので、インデックス未使用クエリーが多いとずらーっと1ページに表示されしまう。

海外のクラウドサーバーを使うとデフォルトの時間設定がUTCだったりするわけでそれを下記の設定で変更します。
# mv /etc/localtime /etc/localtime.org
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

これでdateコマンドをうつと、
2010年 8月 18日 水曜日 09:36:34 JST
とちゃんと返ってきます。

ただcronは、このままでは反映されずUTCで動いたままです。
logwatachが真っ昼間に届いたり。

crondを再起動してしまえば即反映されます。
/etc/init.d/crond restart

8月 17th, 2010sedで置換

特定のディレクトリを再帰的に検索して文字列を置換。

find /home/www/html -name "*.html" -exec bash -c 'sed 's/javascript/hogehoge/g' {} > {}_tmp' \; -exec mv {}_tmp {} \;

だいぶダサい。

find /home/www/html -type f -name "*.html" -exec grep -l "javascript" {} \;
を組み合わせたら置換したファイルの一覧もでる。

LWP等で取得してきたコンテンツをごにょごにょしようとしてもリンク先が相対パスだったら画像等がリンク切れで非常に扱いにくい。
後にその画像だけを取得したい時等。

これがすべて下記のように変換されていると何かと便利
<img src="../../header.gif" />

<img src="http://japan.cnet.com/news/header.gif" />

URIモジュールを使うのその変換を数行のコードでやってくれます。

#!/usr/bin/perl -w
 
use strict;
use warnings;
use utf8;
use LWP;
 
 
my $link = 'http://japan.cnet.com/news/business/story/0,3800104746,20416479-0,00.htm';
 
my $ua = LWP::UserAgent->new;
my $res = $ua->get($link);
 
my $content = $res->content;
 
$content =~ s/href=("|')(\S*)("|')/&change_path($1, $2, $3, $link, 'href=')/gei;
$content =~ s/src=("|')(\S*)("|')/&change_path($1, $2, $3, $link, 'src=')/gei;
 
print $content;
 
sub change_path {
my ($pre, $path, $sur, $link, $element) = @_;
my $uri = URI->new_abs($path, $link);
 
return $element . $pre . $uri . $sur;
}

これで取得したコンテンツのリンクはすべて絶対パスに変わります。
正規表現駆使してやらずともできるのはうれしい。

開発用のサーバーは検索エンジンのbotのアクセスを禁止したりするけど、万が一検索エンジンにインデックスされた場合の事を考えて検索エンジン経由のアクセスも禁止するともっとセキュアになる。
WPやMTはインストールすると同時に検索エンジンへの登録を促されてつい登録してしまう場合があるので、やっといて損はないはず。

googleとyahooのクローラーを拒否する設定
SetEnvIf User-Agent Googlebot robot
SetEnvIf User-Agent Yahoo
order allow,deny
allow from all
deny from env=robot

念のためgoogleとyahoo経由の接続を拒否する設定
SetEnvIf Referer "http://www\.google\.co\.jp/" ref
SetEnvIf Referer "http://www\.yahoo\.co\.jp/" ref
order allow,deny
allow from all
deny from env=ref

〇〇経由でしかファイルをダウンロードさせない(直リンク禁止)とかも要はコレ。



Rackspace Cloud ServersがAmazon EC2よりも優れている点

このサイトをみてからずっと気になってたRackspaceのCloud Serversをようやく登録しました。

特筆すべき点は、下記の3つ。

料金

全体的に安いという話じゃなくて、安いプランが豊富という話です。
EC2の最安値がスモールインスタンスの$0.085なのに対して、Cloud Serversの$0.015という値段。月にして$10ちょい。
メモリ256MでHD10Gっていまどきどうなのと思うけど開発環境として使う分には速度的にもあまり気にはなりません。ちょっと特殊な環境を作りたいときにはこの低料金プランは非常に重宝します。
本番環境でもバッチサーバーやセッションサーバーとして使うならまあOKじゃないかと思います。

すべてのインスタンスが64bit

EC2ではsmall,mediumが32bit、large以上が64bitということでこの2つをまたがってインスタンスを共有することはできません。
smallで作ったインスタンスはmediumでは使えるけどlargeでは使えない。
これは非常に致命的でサーバーをスケールアップしようとするとmediumからlargeに移る際インスタンスをゼロから作りなおさなければなりません。
Cloud Serversはすべてのインスタンスが64bitなのでこの心配がありません。
また、インスタンスを作成してs3に保存しておく必要もなく管理画面のボタンひとつでどのインスタンスにでも移行することが可能です。amazonのRDSのスケールアップに似たイメージ。

バックアップシステム

ec2のインスタンスのバックアップはコマンドを打ち込んで/mnt以下にimageファイルを作ってS3に転送という泥臭いやり方だったのに対して、Cloud Serversでは、稼働中のシステムのバックアップとリストアが管理画面から行えます。
1インスタンスに最大3つまで無料でバックアップをとることが可能で、4つ目以降はamazonのS3に相当するCloud Filesにイメージを保存する形になります。

もちろんEC2にあって、Cloud Filesないもの(ロードバランサー,KVS,auto scaling等)はいっぱいあるので用途によってうまく使い分けるのがいいかと思います。



ただ、最大の欠点として、Cloud Serversは英語の壁が非常に高い。
まず登録フォームでの登録が完了したら15分以内に外人から英語で確認の電話が入ります。(自動音声とかじゃなくて本物の外人さん)
そんな難しい英語ではないけど、むこうは機械的な作業なので自ずと早口になっています。
確認される内容は、名前、住所、クレジットカードの下4桁とセキュリティーコードくらいだったと思います。この電話確認が終わるまで仮登録状態なので管理画面は入れるけどサーバーを立ち上げることはできません。(アクティベート後は一旦ログインしなおす必要があります。)

質問や問い合わせがあるとやたらチャットでカスタマーサポートと話すように促されます。
私の場合もなぜかCloud Filesの一部がアクティベートされてないのでチャットでの問い合わせになりました。レスポンスが早くていいけれど、なんだか英語圏以外の人間には敷居が高いように感じます。

4月 18th, 2010mac book pro購入

先日ついにmacbook proを購入しました。
でるでるといわれ続けて数ヶ月。ようやくでたかといった感じです。
iPadとiPhoneOS4.0の影に隠れてしまって地味な発売となったけど、個人的には最も嬉しかった。
私が買ったのは15インチ: 2.53GHzのオプションなし。ついに初代mac book(中古)を捨て去る時がきた。

特に書くこともないけど新しいmacを使いたいので無理やりメモります。
今回macを買って初めて知った事気付いた事等。

  • iphoneのような慣性スクロールが気持ちいい。長めのページを見るときに非常に便利
  • macのユーザー名は変えれない。姓名が逆になってて気持ち悪いけど我慢
  • 静か。左手のところも熱くならない。
  • トラックパッドは第一関節くらいから触れた方が思い通りに動く
  • 「環境設定」の「トラックパッド」のそれぞれの項目の説明に動画がついてる。すばらしい。
  • itunesのライブラリ移動が簡単。itunesのディレクトリを旧マシン→外付けHD→新マシンでコピーすればok
  • iphotoが楽しい。顔認識技術がすごい
  • iphotoのイベントはよくできてると思うけど、アルバムとの使い分けが難しい
  • iphotoのブック、カレンダー、カードは日本語版にはいらないと思う
  • タイムマシンのUIがカッコ良すぎる
  • 「システム環境設定」の「キーボード」の「F1,F2などのキーを標準のファンクションキーとして使用可能」をチェックをいれるとfnクリックしなくてexposeとかが使える。逆にクリックすると音声上げたり下げたりするのに使える
  • quick silverが開発再開してた。
  • quick silverのトリガーがcommad+spaceが言語関係のなんかとバッティングする。「システム環境設定」の「言語とテキスト」の「入力ソース」の「キーボードショートカット」の「前の入力ソースを選択」のチェックを外す
  • firefoxでcommand + kで検索窓にフォーカス
  • firefoxでcommand + lでロケーションバーにフォーカス

タイトルのまんまですが、はてなブックマークを全文化してEvernoteに保存するhatebte(ハテブテ)を公開しました。
インプットがはてなブックマークEvernoteに分散されてしまってて困ってる人やEvernoteの検索をバリバリ使いたい人には便利なサービスかもしれません。
hatebteに必要情報を登録して後はいつも通りブックマークしていけば数時間したらEvernoteにも全文化して保存されていきます。
もともと自分用に作ってたやつを焼き直したサービスなんで見た目も機能も地味です。

ちなみにこの語感の悪いサービス名はHatena Bookmark to Evernoteを無理やり略したものです。

Googleは米国時間3月19日、オープンソースのウェブセキュリティスキャナ「skipfish」を公開した。ウェブアプリケーションをスキャンして、セキュリティホールの有無を調べられるものだ。
 skipfishでウェブアプリをスキャンすると、ブラインドSQLやXMLインジェクションといった「巧妙な仕掛け」を含む脆弱性の有無が確認できると、Googleの開発者Michal Zalewski氏はskipfishのwikiで述べている。
 skipfishは対象サイトへの再帰的クロールと辞書ベースの調査を実行し、その結果を表示したインタラクティブなサイトマップを作成する。脆 弱性がある場合には強調表示する。また、skipfishが作成する最終レポートは、セキュリティ評価の判断材料として利用できる。
http://japan.cnet.com/news/sec/story/0,2000056024,20410794,00.htm

とりあえず設置したのでメモ。
# wget http://skipfish.googlecode.com/files/skipfish-1.18b.tgz
# tar xvzf skipfish-1.18b.tgz
# cd skipfish
# make
cc -L/usr/local/lib/ -L/opt/local/lib skipfish.c -o skipfish -O3 -Wno-format -Wall -funsigned-char -g -ggdb -D_FORTIFY_SOURCE=0 -I/usr/local/include/ -I/opt/local/include/ \
http_client.c database.c crawler.c analysis.c report.c -lcrypto -lssl -lidn -lz
 
See dictionaries/README-FIRST to pick a dictionary for the tool.

これでとりあえずインストール完了です。

このままでは使えないので使用する辞書をdictionariesから選びます(ここではdefault.wl)
# cp dictionaries/default.wl skipfish.wl

で、実際に動かしてみる。

http://localhost/hogeの脆弱性をチェックしてレポートをvar/www/html/logに保存するサンプル

./skipfish -o /var/www/html/log http://localhost/hoge
-o 結果をここで指定したディレクトリに吐き出してくれる
ディレクトリは空である必要がある。

ベーシック認証を突破したい時
-A (ユーザー名):(パスワード)

500件〜2000件/秒アクセスするので要注意。
必ず自分でテスト環境で行うこと。