Aug
13

cURL に HTTPS でアクセスできるように証明書を追加する

ウェブサービスの開発をしていると、プログラムの中で HTTP で通信をするために cURL を使うことが多いと思います。
PHP からも cURL を使うための 便利なライブラリ があります。
普通の HTTP のリクエストを投げる場合は用意されたものをそのまま使えばいいのですが、HTTPS で通信を行いたい場合は、サイトによっては証明書が必要だったりします。
素のままの状態で、例えば https://mixi.jp/ にアクセスすると、次のようなエラーでアクセスすることができません。

% curl ‘https://mixi.jp/’
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html
 
curl performs SSL certificate verification by default, using a "bundle"
of Certificate Authority (CA) public keys (CA certs). The default
bundle [...]

Jul
17

iPhone のメールを Mew で読む

7月11日、iPhone が発売されましたね。前日、表参道には長蛇の列ができていましたが、販売店によっては当日開店時間に行けば普通に入手できたところもあったみたいですね。
さて、iPhone を契約すると i.softbank.jp ドメインのメールアドレスがもらえるわけですが、このメールは imap を使って読み、smtp を使って送信する普通のメールなので、iPhone 上だけでなく、imap が使える MUA ならば PC など他の端末でもメールを読み書きすることができます。
例えば Emacs 上で動作する MUA である Mew で iPhone のメールを読むためには、~/.mew.el に次のように設定します。

(setq mew-name "Jog Note")
(setq mew-user "jognote")
(setq mew-mail-domain "i.softbank.jp")
(setq mew-smtp-server "smtp.softbank.jp")
(setq mew-smtp-port "587")
(setq mew-smtp-user "jognote")
(setq mew-proto "%")
(setq mew-imap-user "jognote")
(setq mew-imap-server "imap.softbank.jp")
(setq mew-fcc "%Sent Messages")

iPhone の smtp は通常の 25 番ポートではなく 587 番ポートで動作しているので、mew-smtp-port でポート番号を指定します。また、iPhone の smtp [...]

Jun
9

[Xen]DomainUをさくっと作る方法

ジョグノートでは開発や実験を行うための環境として Xen を使っています。
Xen のバーチャルマシンは DomainU と呼ばれていて、DomainU の作成方法としてはここで紹介されているように virt-install を使う方法が一般的なようです。
しかし virt-install はいろいろな仮想化技術をラップするライブラリである libvirt を使っていて、Xen の DomainU を作成するために Xen 以外のソフトウエアのお世話になるのは少々大袈裟な気がします。
なので Xen の機能のみ使って DomainU を作成できればと思い、調べてみました。基本的にはここにある方法で作業を進めていきます。
以下は CentOS 5.0 が動いている Domain0 上で CentOS 4.6 がインストールされた DomainU を作成するための手順です。
DomainU を新規に作成する場合には OS のインストーラを DomainU として走らせる必要があり、まずはインストーラのための DomainU の設定ファイルを作成します。
インストーラのための設定ファイルを /etc/xen/centos4.installation として以下のように作成します。
ちなみに /etc/xen は root 以外はディレクトリの中に入ることもできないので、実際に作業をする時には sudo bash などして root 権限でシェルを立ち上げてから作業をしたほうがやりやすいでしょう。

kernel = "/var/lib/xen/images/vmlinuz-CentOS4.6-Installer"
ramdisk = "/var/lib/xen/images/initrd-CentOS4.6-Installer.img"
extra = [...]

May
14

さくらの専用サーバに入っている FreeBSD 5.4-RELEASE を 6.3-RELEASE にリモートアップデートしてみた

現在、ジョグノートで借りている さくらインターネット のサーバで、古いものは FreeBSD の 5.x 系が入っています。
先日 7.0 がリリースされて、6.x シリーズも Legacy になったので、そろそろ 5.x 系も 6.x 系にアップグレードすることにしました。
基本的には handbook にある通りに作業をすればよいわけですが、物理的に完全に隔離された場所にサーバがあり、コンソールはおろか、リセットスイッチさえ押せないので、全ての作業をリモートから行う必要があります。
handbook の手順だと、一旦シングルユーザモードでの再起動が必要になりますが、リモートでアップグレードを行う場合には、そうするわけにはいきません。
マシンに接続されているキーボードにアクセスすることができないので、ブートマネージャにシングルユーザモードで起動する旨を伝えることもできないし、仮にさくらの人に何とかしてもらうことにして、シングルユーザモードで起動しても、telnet や ssh で中に入ることはできません。
シングルユーザモードですから、直接 root で作業をするしかないのです。
ということで、途中でシングルユーザモードでの再起動をしないで全ての作業を行う、というのが、今回のアップグレードの要になります。
さて、作業の手順です。
まずは cvsup を用いて最新版のソースを取ってきます。
/usr/share/examples/cvsup/standard-supfile あたりを参考に、次の内容でファイルを用意します。

*default host=cvsup2.jp.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_6_3
*default delete use-rel-suffix

src-all

余談ですが、host として指定した cvsup2.jp.FreeBSD.org は、実はYahoo! JAPANのサーバだったりします^^;
Yahoo! JAPAN は FreeBSD のヘビーユーザとしても有名ですね。

; <<>> DiG 9.3.4-P1 <<>> cvsup2.jp.FreeBSD.org
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: [...]

Apr
17

JogNoteの写真投稿機能はMogileFSを使って実装されています

今日、JogNoteの記録に写真を投稿できる機能をリリースしました。
この写真投稿機能は、ストレージとしてMogileFSを使っています。
システム構成を図にすると、次のような感じになっています。

ちなみにこの図はgliffyというブラウザ上で図が作成できるサービスのフリーアカウント版で作りました。
使用しているサーバは、さくらインターネットの専用サーバです。回線は10Mスタンダードで、OSはCentOS 4を使用しています。前にFreeBSDにMogileFSをインストールする記事を書きましたが、あれからいろいろ問題が起こり、安定運用させるためにはLinux上で動作させるほうが安心、ということで、CentOS上で稼働させることにしました。
外部からのリクエストを一手に引き受けるリバースプロキシは、MogileFSのサーバ群だけでなく、JogNote本体のサービスの入口でもあります。リバースプロキシにはnginxというhttpdを使用しています。
MogileFSは3台のマシンで動作しており、そのうち2台でデュアルマスタによる冗長化をしたMySQLと、MogileFSを便利に使うためのラッパーAPIが動作しています。このラッパーAPIは、写真のアップロードやサムネイルの生成、アクセストークン付きのURLの発行などを行います。
ウェブ上の情報を探してた限りだと、現在のところMogileFSを用いてウェブサービスを運用しているところは、そんなに多くないように思います。JogNoteの一部としてMogileFSを運用し、そこで得たノウハウをここで紹介できたらいいなと思っています。

Mar
14

MogileFSの冗長化機能のテストをしてみる

昨日の記事で、今度はLinux上にXenのDomainUを複数用意して実験をすると書きましたが、実験環境を用意するのに時間がかかるので、FreeBSD 6.2上の mogstored に複数の device を用意することで、冗長化機能のテストをしたいと思います。
物理的な host を複数台用意しても、その上には device を作成し、ファイルは device の上に作成される domain と class の上に生成されるので、host は1台でも device を複数用意すれば、同じような実験ができるものと考えられます。
さて、今回はMogileFS上の device が突然壊れた場合でもちゃんと冗長化機能が働いているかどうかの実験をしたいと思います。
多くの場合、あるファイルは2個所に存在していれば十分な冗長性が確保できると考えられます。仮に片方のストレージが物理的に壊れてしまっても、もう片方が生きていればファイルの消失は避けられます。2台のストレージが同時に壊れる可能性は、そんなに高くはないでしょう。
MogileFSで2個所のストレージを定義するためには、device を2つ作成する必要があります。
しかし、本当に2つで大丈夫でしょうか?
仮に2つの device うちの1つが壊れたとします。すると、この時にMogileFS上には各々のデータは1つしか存在しないことになります。1つの device が壊れている間に追加されるデータもまた、1つしか作成されていないことになります。
すぐに壊れた device を復旧することができればいいですが、常にそうできるとも限らないので、device は3つ以上あると運用上都合がよいと考えられます。3つのうち1つが壊れてしまっても、壊れたことがわかった時点ですぐにその device をMogileFSから切り離せば(device の状態を dead にする)、その device に保存されていたデータはMogileFSの冗長化機能によって他の2つの device のどちらかに作成されます。この間に新たに追加されるデータもまた、この2つの device 上に作成されます。そして、2つの device で運用できている間に壊れた device を復旧して、また3つの構成に戻せばよいのです。
では、MogileFS上に3つの device を作成してみます。
まずは現在の状態をチェックしてみます。

% sudo -u mogile mogadm –trackers=127.0.0.1:6001 check
Checking trackers…
127.0.0.1:6001 [...]

Mar
13

MogileFSのmogstoredは同じホストで複数動かせない

昨日、FreeBSD 6.2上にMogileFS環境を構築するための記事を書きました。今日はMogileFSに実際にストレージスペースの設定をしてファイルを置いてみて、さらにストレージの一部が突然壊れてしまった場合にちゃんとスケールできるかどうか確認するための記事を書こうと思い、記事にするための実験をしていました。
1台のマシンを使って複数台で構成されるMogileFSの環境を作るために、 mogstored を異なるポートで複数起動しようとしたのですが、そこで手詰まりとなりました。1つのホストで動かすことのできる mogstored は1つだけのようです。
次のように2つ分の mogstored の設定ファイルと docroot で指定したディレクトリを用意して、 mogstored を起動させました。
/home/mogile/etc/mogstored1.conf

httplisten=0.0.0.0:7500
mgmtlisten=0.0.0.0:7501
docroot=/home/mogile/var/mogdata1

/home/mogile/etc/mogstored2.conf

httplisten=0.0.0.0:7502
mgmtlisten=0.0.0.0:7503
docroot=/home/mogile/var/mogdata2

% sudo -u mogile mkdir -p /home/mogile/var/mogdata{1,2}
% sudo mogstored –daemonize –config=/home/mogile/etc/mogstored1.conf
% sudo mogstored –daemonize –config=/home/mogile/etc/mogstored2.conf

とりあえず起動はします。

% ps auxww | grep mogstored
root 89967 0.0 2.5 11560 11028 ?? S 3:18PM 0:00.45 mogstored (perl)
root [...]

Mar
12

MogileFSをFreeBSD 6.2上にインストールする

MogileFSという分散ファイルシステムがあります。これは大雑把に言うと、ネットワーク上にある複数台のマシンをストレージとみなすことにより、分散ファイルシステムを実現したものです。MogileFS上に保存するファイルにはプライオリティをつけることができ、その重要度によって必要分だけMogileFS上にコピーが作成されます。各々のストレージマシンは取り外しが簡単にできるようになっていて、突然マシンが故障してファイルが取り出せなくなっても、そのマシンを使わないように設定すれば、他のマシンに保存してあったファイルを元に、また別のマシンに必要分だけコピーが生成されます。
MogileFSについてのもっと詳しい説明は、以下のページがとても参考になります。

Six Apart – Tech Talk Blog: 分散ファイルシステム MogileFS について
Six Apart – Tech Talk Blog: MogileFS のインストールと初期設定

ちなみに、MogileFSはmemcachedで有名なDanga InteractiveのBrad Fitzpatrickさんが開発したものです。
MogileFSはPerlで書かれており、CPANにも登録されているので、CPAN経由でインストールするのが楽そうです。
ですが、MogileFSについてよく知らないし、他の現在運用中の何かと競合してしまっても困るので、完全に独立したディレクトリにPerlをインストールして、そこにsvnから取ってきた最新のMogileFSをインストールすることにしました。
MogileFSのインストール方法は本家のwikiが参考になります。
また、MogileFSの司令塔であるTrackerは非root権限で動作させる必要があるので、MogileFSのための専用のアカウントを作成することにします。

% sudo groupadd mogile -g 60056
% sudo useradd mogile -u 60056 -g mogile -s /usr/sbin/nologin

ユーザmogileのホームディレクトリは /home/mogile になるので、/home/mogile 以下にMogileFS環境を構築していきます。
まずはPerlを /home/mogile/perl にインストールします。
CPANからPerlのソースを取ってきて展開します。

% sudo -u mogile mkdir /home/mogile/src
% cd /home/mogile/src
% sudo -u mogile wget ‘http://www.cpan.org/src/perl-5.10.0.tar.gz’
% sudo -u mogile tar zxvf perl-5.10.0.tar.gz
% [...]

Feb
26

[Pidgin]現行Yahoo!メッセンジャーでPidginの文字化けを回避するためのパッチとWindowsバイナリ

PidginというIM(Instant Messenger)クライアントがあります。これはMSN MessengerとかYahoo!JAPAN Messengerとか、他にもいろいろなプロトコルに対応した便利なIMクライアントです。Linux上でも動作するので、普段から便利に使っています。
なのですが、ウェブ版Yahoo!メッセンジャーのリリースのタイミングで、メッセージをやりとりするための文字コードがSHIFT-JISからUTF8に変更になったようで、pidginから送ったメッセージが相手に表示されなかったり文字化けを起こしたりするようになってしまいました。
2008年2月26日をもって「バージョン7.0.1.0未満」のWindows版Yahoo!メッセンジャー、および「バージョン2.5」のMacintosh版Yahoo!メッセンジャーのサポートを終了させていただきました。
とあるので、これまでSHIFT-JISとUTF8と両方の文字コードをサポートしていたけど、これからはUTF8一本に統一します、ということかもしれないですね。
仕事でもプライベートでもメッセンジャーを愛用していて、これが使えなくなってしまうととても不便です。
なので、これを回避するためのパッチを作ってみました。

#
# old_revision [d77adf1b9a4b44f121620f20e2643602e3f6776e]
#
# patch “libpurple/protocols/yahoo/util.c”
# from [6a72fcc2054413ee7791e5c5cc62b6b18f4bcce0]
# to [2a3725bcc455684e1c1bb42bd4982cc322732f38]
#
============================================================
— libpurple/protocols/yahoo/util.c 6a72fcc2054413ee7791e5c5cc62b6b18f4bcce0
+++ libpurple/protocols/yahoo/util.c 2a3725bcc455684e1c1bb42bd4982cc322732f38
@@ -114,18 +114,15 @@ char *yahoo_string_encode(PurpleConnecti
char *ret;
const char *to_codeset;

- [...]

Feb
18

[MySQL]mysqldはシグナル0を受けとるとどうする?

MySQLには、mysqldを起動したり停止したりするためのツールmysql.serverが含まれています。バイナリディストリビューションの場合にはsupport-filesディレクトリの中にあります。
このツールの中でやっていることが知りたくてソースを読んでいたのですが、気になる記述がありました。

’status’)
# First, check to see if pid file exists
if test -s “$server_pid_file” ; then
read mysqld_pid < $server_pid_file
if kill -0 $mysqld_pid 2>/dev/null ; then
log_success_msg “MySQL running [...]