Browse Month: July 2008

svnsync の設定方法

subversion 1.5 系がすでに登場しているけれど、subversion 1.4 系から新搭載された svnsync を使ってみた。svnsync の使ってみたわけは、手軽に svn リポジトリをホットバックアップをとるために設定してみた。

まず、バックアップ先のサーバで普通に svn リポジトリを作成する。

$ svnadmin create /svn

次に、バックアップ先で作成した svn リポジトリの pre-revprop-change hook を次の内容で作成する。デフォルトの pre-prevprop-chage.tmpl をコピーするより新規作成した方が速い。

#!/bin/sh

exit 0

pre-revprop-change hook に実行権権限を与えておく。

$ chmod +x svn/hooks/pre-revprop-change

そして、svnsync を利用可能な状態にするために初期化する。バックアップ先とバックアップ元のパラメータ順序に注意する。

$ svnsync init svn+ssh://バックアップ先のサーバ/svn svn+ssh://バックアップ元のサーバ/svn

svnsync は当り前だが、http や file 経由でも可能。

初期化したあとは、バックアップ元のリポジトリと同期させる。

$ svnsync sync svn+ssh://バックアップ先のサーバ/svn svn+ssh://バックアップ元のサーバ/svn

Committed revision 1.
Copied properties for revision 1.

念のため、svn info でバックアップ先のリポジトリがバックアップ元のリポジトリとリビジョン番号があっていることを確認する。

あとは、cron や post-commit hook で自動的に同期してあげればよい。post-commit hook に設定しておけば十分なので post-commit hook に次を追加した。

svnsync sync svn+ssh://バックアップ先のサーバ/svn svn+ssh://バックアップ元のサーバ/svn

ちなみにバックアップ先の svn リポジトリにもコミットできてしまうので注意すること。

ということで、svnsync は、手軽に svn リポジトリをホットバックアップするのに便利な機能です。

cobbler を使ってみた

新しく到着したサーバには、CD ドライブがついていないということでネットワークインストールしてみようと考えた。そこで、巷で話題の cobbler 0.8.3 を使ってみた。まず、試験環境を VMWare 上の CentOS 5.1 64 ビット版で用意して試してみた。mizzy さんの記事がとても参考になった。

まず、rpmforge をインストールする。

# wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
# rpm -ivh rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm

次に、cobbler をインストールする。
# yum install cobbler

tftp とか httpd とか必要なものがいっきにインストールされる。

さっそく設定してみる。

# cobbler check

The following potential problems were detected:
#0: The ‘server’ field in /var/lib/cobbler/settings must be set to something other than localhost, or kickstarting features will not work. This should be a resolvable hostname or IP for the boot server as reachable by all machines that will use it.
#1: For PXE to be functional, the ‘next_server’ field in /var/lib/cobbler/settings must be set to something other than 127.0.0.1, and should match the IP of the boot server on the PXE network.
#2: change ‘disable’ to ‘no’ in /etc/xinetd.d/tftp

ということで、/var/lib/cobbler/settings を次のように変更する。変更する部分は、manage_dhcp を 1、next_server と server の部分をホストの IP アドレスに書き換える。


bootloaders:
ia64: /var/lib/cobbler/elilo-3.6-ia64.efi
standard: /usr/lib/syslinux/pxelinux.0
default_kickstart: /etc/cobbler/default.ks
dhcpd_bin: /usr/sbin/dhcpd
dhcpd_conf: /etc/dhcpd.conf
dnsmasq_bin: /usr/sbin/dnsmasq
dnsmasq_conf: /etc/dnsmasq.conf
httpd_bin: /usr/sbin/httpd
kernel_options:
ksdevice: eth0
lang: ‘ ‘
text: ~
koan_path: ”
manage_dhcp: 1
manage_dhcp_mode: isc
minimize_syncs: 1
next_server: ‘192.0.168.1’
server: ‘192.0.168.1’
syslog_port: 25150
tftpboot: /tftpboot
tftpd_bin: /usr/sbin/in.tftpd
tftpd_conf: /etc/xinetd.d/tftp
webdir: /var/www/cobbler
xmlrpc_port: 25151
yum_core_mirror_from_server: 0

次に tftp を有効にするために、/etc/xinetd.d/tftp を次のように変更する。disable を yes から no にする。

# default: off
# description: The tftp server serves files using the trivial file transfer \
# protocol. The tftp protocol is often used to boot diskless \
# workstations, download configuration files to network-aware printers, \
# and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}

cobblerd を起動する。

# /etc/init.d/cobblerd start
# chkconfig cobblerd on

xinetd を起動する。

# /etc/init.d/xinetd start
# chkconfig xinetd on

httpd を起動する。

# /etc/init.d/httpd start
# chkconfig httpd on

とりあえず、iptables をオフにしておく。

# /etc/init.d/iptales stop
# chkconfig iptables off

dhcpd をインストールする。

# yum install dhcp

/etc/cobbler/dhcp.template を次のように変更する。IP アドレスの部分を環境に応じて書き換える。

ddns-update-style interim;

allow booting;
allow bootp;

ignore client-updates;
set vendorclass = option vendor-class-identifier;

subnet 192.0.168.0 netmask 255.255.255.0 {
option routers 192.0.168.1;
option subnet-mask 255.255.255.0;
range dynamic-bootp 192.0.168.10 192.0.168.20;
filename “/pxelinux.0”;
default-lease-time 21600;
max-lease-time 43200;
next-server $next_server;
}

$insert_cobbler_system_definitions

そして、ネットワークに必要なファイルを作る。今回は、CentOS 5.1 DVD イメージをダウンロードしてマウントしてある。/var/www/cobbler に必要なファイルを自動的に作ってくれるので便利。容量は、だいだい くらい 4GB くらい必要。けっこう時間がかかる。僕の環境 (Macboom on VMware fusion)だと、だいだい 30 分くらいかかった。

# mount -rt iso9660 /dev/cdrom /mnt
# cobbler import –mirror=/mnt –name=centos51
(書略)
—————- (syncing)
sync distro: centos51-xen-x86_64
sync distro: centos51-x86_64
sync profile: centos51-xen-x86_64
sync profile: centos51-x86_64

cobbler のキックスタートファイルを変更したときは、次のコマンドを実行する。

# cobbler sync
sync distro: centos-xen-x86_64
sync distro: centos-x86_64
sync profile: centos-xen-x86_64
sync profile: centos-x86_64
Shutting down dhcpd: [FAILED]
Starting dhcpd: [OK]

どんなファイルがあるか確認してみる。

# cobbler report
distro : centos-x86_64
kernel : /var/www/cobbler/ks_mirror/centos/images/pxeboot/vmlinuz
initrd : /var/www/cobbler/ks_mirror/centos/images/pxeboot/initrd.img
kernel options : {}
architecture : x86_64
ks metadata : {‘tree’: ‘http://192.0.168.1/cblr/links/centos-x86_64’}
breed : redhat
(略)
profile : centos-x86_64
distro : centos-x86_64
kickstart : /etc/cobbler/kickstart_fc6.ks
kernel options : {}
ks metadata : {}
virt file size : 5
virt ram : 512
repos : []
(略)
cd

# cobbler list
distro centos-xen-x86_64
profile centos-xen-x86_64
distro centos-x86_64
profile centos-whx86_64

kickstart のファイルは、/etc/cobbler/kickstart_fc6.ks だということが分かる。

付属の /etc/init.d/cobbler は restart がおかしいので、次のように修正する

45c45
< killproc /usr/bin/cobblerd -TERM >& /dev/null

> pkill -9 cobblerd >/dev/null 2>/dev/null

ちなみに上の不具合は、最新版の 1.x 系では修正されているので、今から試してみる人は 1.x 系をおすすめします。

cobbler を使うと、ローカルの yum ミラーリポジトリも扱うことができるので、かなり便利なのでおすすめです。

passenger 2.0.2 を試す

Phusion Passenger の 2.0.2 がリリースされたということで、さっそく試してみた。
マシンは DELL SC440、OS は CentOS i386 です。

まず、Passenger をインストールする前に必要な ruby のパッケージをインストールする。

  • $ sudo /usr/bin/yum -y install ruby ruby-rdoc ruby-devel
rubygems がないと困るので、前に作った SPEC ファイル(rubygems.spec)を改良したものとパッチrubygems-prefix.prefixをあてて rubygems 1.1.1 をさくっと作る。 
  • $ /bin/mv rubygems.spec ~/rpm/SPECS
  • $ /bin/mv rubygems-prefix.prefix ~/rpm/SOURCES
  • $ /usr/bin/rpmbuild -ba ~/rpm/SPECS/rubygems.spec
ついでに、ビルドした rubygems の noarch RPM も置いておきます。rubygems-1.1.1-1.noarch.rpm

gem から、rails と passenger をインストールして確認する。

  • $ /usr/bin/sudo gem install passenger
  • $ /usr/bin/gem list –local
gem list して、passenger (2.0.2) があれば OK。Apache2 用のモジュールをビルドする。
  • $ sudo /usr/bin/yum -y install httpd-devel
  • $ sudo /usr/bin/passenger-install-apache2-module
ビルド後に、次のようなメッセージが表示されれば OK。

——————————————–
The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2
PassengerRuby /usr/bin/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Press ENTER to continue.

そして、テスト用の rails 2.1.0 のアプリケーションを作る。

  • $ /usr/bin/rails ~/sample
とりあえず、~/sample/script/server で動かして 3000 ポートでの動作確認したら、さっそく Apache の設定をする。httpd.conf に追記してもよいが、/etc/httpd/conf.d/passenger.conf をおいた。Apache は worker で動かすために /etc/sysconfig/httpd を編集して “HTTPD=/usr/sbin/httpd.worker” の行をアンコメントする。Apache の MPM を変更するときには、httpd を止めた状態で行う必要がある。動いているときに変更すると、httpd のプロセスが動いているので sudo killall httpd する必要があるっぽい。
/etc/httpd/conf.d/passenger.conf

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2/ext/apac
he2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2
PassengerRuby /usr/bin/ruby
ServerName sample.example.com
DocumentRoot /home/test/sample/public
RackEnv production

 
設定して、Apache を起動したら、ローカルから動作確認する。確認がとれたら、すこしベンチマークを計測してみる。まず、ローカルから ab コマンドを計測してみる。ちなみに $HOME ディレクトリで実行するには $HOME ディレクトリのパーミッションを 755 に変更しておく必要がある。

  • $ curl localhost
  • $ ab -c 40 -n 10000 http://localhost/
結果は、次の通り。

Concurrency Level: 40
Time taken for tests: 2.458972 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 76581216 bytes
HTML transferred: 73909080 bytes
Requests per second: 4066.74 [#/sec] (mean)
Time per request: 9.836 [ms] (mean)
Time per request: 0.246 [ms] (mean, across all concurrent requests)
Transfer rate: 30413.52 [Kbytes/sec] received

 

 

そして、外部から LVS(NAT) + VRRP 経由でアクセスした結果は次のとおり。リアルサーバは、まったく同じスペック構成のサーバ2台。ab コマンドを実行しているときの、リアルサーバのロードアベレージは 0.00 だった。

 

Concurrency Level: 40
Time taken for tests: 69.353809 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 76534825 bytes
HTML transferred: 73869030 bytes
Requests per second: 144.19 [#/sec] (mean)
Time per request: 277.415 [ms] (mean)
Time per request: 6.935 [ms] (mean, across all concurrent requests)
Transfer rate: 1077.68 [Kbytes/sec] received

 

 

かなり回線の影響があることが分かった。

次に Apache の不要なモジュールをすべてはずして、ローカルから再度実験してみた。

 

Concurrency Level: 40
Time taken for tests: 2.390891 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 76565912 bytes
HTML transferred: 73894310 bytes
Requests per second: 4182.54 [#/sec] (mean)
Time per request: 9.564 [ms] (mean)
Time per request: 0.239 [ms] (mean, across all concurrent requests)
Transfer rate: 31273.28 [Kbytes/sec] received

 

 

そんなに変化はない、次に worker のパラメータを次のように変更して、同じくローカルから試してみた。worker のパラメータを変更するときは、必ず stop してから start する。

 

Concurrency Level: 40
Time taken for tests: 2.333074 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 76520000 bytes
HTML transferred: 73850000 bytes
Requests per second: 4286.19 [#/sec] (mean)
Time per request: 9.332 [ms] (mean)
Time per request: 0.233 [ms] (mean, across all concurrent requests)
Transfer rate: 32028.99 [Kbytes/sec] received

 

 

これはそんなには変わらない。

この状態で LVS 経由で外から試してみた結果は、次のとおり。

 

Concurrency Level: 40
Time taken for tests: 73.91778 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 76528276 bytes
HTML transferred: 73862686 bytes
Requests per second: 136.81 [#/sec] (mean)
Time per request: 292.367 [ms] (mean)
Time per request: 7.309 [ms] (mean, across all concurrent requests)
Transfer rate: 1022.47 [Kbytes/sec] received

 

 

そんなに変化はなかった。

しかし、試験しているときに httpd プロセスが落ちることがなかったので、passenger はかなり使えそう。
 

lighttpd との比較をしてみたかったが、今日のところはここまでにしておく。

 

さぁ、ROR をはじめよう!

私塾のすすめを読んで

斉藤さんと梅田さんの対談本、「私塾のすすめ」を読んだ。読み始めたら、共感する部分が多くて一気に読破してしまった。

僕もここまだ5年くらいだと思うけれど、自分のやりたいこと、何のために生きているのだろう、今日本当にやりたいことは何かと真剣に考えている。もうずっと考え続けていて、まったく答えが出ずにただ時間だけが過ぎ去って行くので内心かなり不安になっている。もしかして、見つからないのではないかなと思う瞬間もあります。

去年から、会社の同僚にすすめられてたくさんのブログを読んでいるけれど、ブログを読むのはかなり面白し、自分のためにもなると思うけれど、今自分がコードを書けるようになりたいと望んでいても実際に書かなければ書けない。例えば、Google Code Jam の問題を見てもすぐに理解できないし、コードを思い浮かばない。もし自分がプログラマーという仕事でこれからもサバイバルをしていくのなら、このままでは「負け」なのではないかと思う。

その反面もしかしたらプログラマー以外のことをしたいんじゃないかと思うことがあるけれど、具体的にやってみないと分からないし、他のことに興味がないところをみるときっとあっているのかもしれないとも思う。

さまざまな分野で本当にやりたいことをやっている人たちにはずっと憧れというか、ロールモデルというか、そういう姿で生きていたい。ちなみに、今日の夢はなぜかタイガー・ウッズと一緒にゴルフコースに向かう夢を見ていた。ゴルフコースに向かう前に僕のせいで出発が遅れてタイガー・ウッズに英語で怒られているという不思議な不思議な夢を見た。

何か好きなんだろうって、ずっと考えていても答えは見つかるはずもないので、何か全力で初めて限界まで突き詰めていって自分が何を感じるのかを知りたいと思って、今の仕事には取り組んでいるつもりだけれど他の欲求食欲とかが優先されてしまう時点で、それって違うんじゃないのとふと思ってしまう自分がいるのがとても不思議。

私塾のすすめを読んで、僕も自分の時間を何に使うかといったことを真剣に考えたい。すべてはできるはずがないので、自分の時間を使う優先順位を設定して何をして何をやらないのかを決めて遮断したい。ただ、僕も優柔不断なところがあるので、「シリコンバレーに住んでいますから無理です」と言えるのなら言いたい派であることは間違いない。
本の中で、梅田さんが「ウェブの細道」というプロジェクトを考えているとのことで、とても面白いプロジェクトだと思う。僕のところには来てくれるはずもないが、梅田さんには日本以外の国で活躍しているブログなどで情報発信している日本人にもあっていだいてぜひ書籍やブログにアップしていただきたいなと思う。

プログラマーは、プログラムを書けなければ「負け」なのでさらに全力でやってみて勝てるのかどうか見極めてみたいと、私塾のすすめを読みながらそう思った。

 

私塾のすすめ ─ここから創造が生まれる (ちくま新書 (723))

iPod Touch で iPhoto が自動起動してしまうのを防止する方法

iPod Touch 2.0 にアップグレードしてから、iPod Touch を Mac mini に接続するたびに iPhoto が自動起動するようになりました。
なぜか、iTunes が自動起動せずに iPhoto が自動起動してしまうという現象に変わりました。

iPod Touch を接続するたびに iPhoto が自動起動してしまうのをやめたいと思って、調べてみるとiPhone で同じようなことをやっているブログを見つけました。この方法を参考にして iPod Touch でやってみたのですがうまくいきませんでした。
そもそも、カメラを接続するときはあまりないので(すべて Eye-Fi 経由なので)、iPhoto の自動起動をオフにすることにしました。

やり方は、アプリケーションにある Image Capture というソフトを起動して、Image Capture Preferences で「No application」に変更するだけです。

iPod Touch 2.0 で、iPhoto が自動的に起動するのは微妙ですね…

rubygems 1.1.1 の Spec ファイルを作った

rubygems の最新版 1.1.1 を RPM で作るために Spec ファイルを作ってみた。この Spec ファイルは、ここに公開されている 0.9.4 の Spec ファイルを参考にして変更した。0.9.4 から、1.1.1 でかなり変わっていてかなり大変だったけれど、問題なく RPM がビルドできるはず。動作環境は、CentOS 5.1 x86_64 で ruby 1.8.5 の環境です。

おそらく、rubygems 1.1.1 の Spec ファイルは、世界初ではないかと思う。

よかったら、使ってください。

rubygems.spec

# どこかに Spec ファイルを共有するリポジトリってないのかな?

読んだ本たち

レバレッジ人脈術を読んだ。次の内容が印象に残った。

  • 一人では生きていけないので、いろいろな人に出会うことが大切
  • 自分が相手にどんな情報を提供できるのかよく考える
  • 「誰を知っているか」ではなく、「誰に知られているか」
  • まったく違う畑の分野の人達ではなく、なるべく同じ畑の人達にあう
  • 自己紹介は時間の無駄、自分について知ってもらう情報は公開しよう
  • 「ギブアンドテイク」ではなく、「コントリビューション」が基本
  • 自分が会いたい相手に連絡するときは、相手にどんなコントリビューションができるか伝える
Joel さんの本、ソフトウェア開発者採用ガイド。
この本は、おもによいプログラマーを集めて離職率を下げるかについて書かれていました。
  • Joel さんのインターンのお出迎え方法がすごすぎる
  • Q: When is the last time you behaved cowardly? というマイクロソフトに面接に行ったときのエピソードが興味深い
  • Joel さんは、必ず昼食と仲間たちと大きなテーブルで一緒に食べている、会社が家族と感じられるような効果があって 6 年間で会社を辞めた人は 1 人もいないそう、このエピソードは相当強烈だった
そして、佐々木さんのウェブ国産力。未来検索ブラジルの取材とライフログ携帯電話電話の考察がかなり面白かった。未来検索ブラジルは、今後もようチェックな会社です。未来検索ブラジルは、Senna の開発元なのでかなり有名ですが、社内では Hyper Estraier を採用している場面が多いです。ウェブ国産力にあったインタビューを見ると、Senna を試してみたくて仕方がなくなってきたので近いうちにレポートしたいと思う。
最初の直感がけっこう正しいという斬新な切口の本でした。本の中で、ペプシとコカコーラの話はとても興味深いかったです。中途半端な試験結果をあてにしても成功しないというエピソードです。あと、アメリカではスピードデートといういわゆるカップリングパーティがはやっているらしい。スピードデートは、初対面の男女が6分ずつ話をしていってお互いに気に入ったら連絡先が交換できるのだそう。将来のパートナー候補をわずか6分で決めるとはなかなかすごいことだなと思う。最初の印象がとても大事だということが分かるエピソードです。僕も第一感を大事にしていきたい。
トレンジスタから始まるコンピュータの歴史から、今インターネット上に行っていることがとても丁寧にまとめられている本です。そこから、これからはどういう時代になるか池田さんならではの考えがぎっしり書かれている本です。
次に仕事とプレイベートの充実をはかるための読んだ本。僕は今まで遅くまで残業することが心の奥底で仕事をしていることだとずっと思っていた。この本を読んで、それははっきりいって間違っているということに気がついた。 あと、そもそも一つのことに対する集中力は続かないことを前提して、同時に複数の仕事を進めていくことも明日から実践していきたい。
休日、平日の夜などに必ず時間厳守の予定を入れるようにしたいとして、定時に会社を出るように意識したい 。
次になかなか朝方に切替えることができないので、そのためのヒントとして読んだ「幸運を呼びよせる朝の習慣」という本。同じシリーズに夜の習慣もありました。
  • 朝、3分間自分について考える時間をもつ
  • 朝、自分の夢を口にする
  • 朝、起きるとき好きな曲か太陽の光で起きる
  • 朝、起きるときに手をぎゅっとにぎる
  • 朝、起きてすぐ10秒間正座する
  • 朝、グレープフルーツの香りを嗅ぐ
  • 朝、水かキャロットジュースは必ず飲もう
  • 朝、ガムを噛む

zsh の umount コマンドを正しく補完する方法

いつも Mac OSX 10.5 で、最新の zsh-devel を使っていますが、umout コマンドを入力してから補完させようと Tab キーを押すと、次のようなエラーが発生することに気がついた。

  readlink: illegal option — q

  usage: readlink [-n] [file …]

たくさん、このエラーがでるので修正しようと調べてみると、mount コマンドの補完関数である _mount の不具合であることに気がついた。

そこで、自分のホームディレクトリの .zfunctions に zsh の最新版に _mount を差しかえてみた。

再度試してみると、今度は次のようなエラーが発生した。

  _mount:889: bad pattern: (#m)\[0-7](#c3)

どうも正規表現がおかしいみたい、該当コードをみてみたが複雑すぎて理解できなかったので、とりあえずコメントアウトしてみた。

さらに umount コマンド補完を試してみたら、うまくいった!!!

これで問題ないだろうと、Fedora Core のサーバの設定ファイルも同じにしてみたら、今度は /sbin/mount コマンドがないというエラーに遭遇してしまった。調べてみると、/bin/mount に配置されている。OSX は、/sbin/mount だったのに。。。仕方がないので mount コマンドをフルパスで記述しているところを mount に変更してみた。

 

iPod Touch 2.0

週末に iPhone を買うかどうかさんざん迷ったが、とりあえず今持っている iPod Touch 32GB を iPod Touch 2.0 へバージョンアップしてみることにした。
iPhone SDK もダウンロードしたので、さっそくチュートリアルをみながらアプリケーションを開発してみようと思います!!!
iPod Touch 2.0 ファームウェアは、なんと 222.6MB もあって、今ダウンロード中。

procmail 小ネタ

procmail を使っていますが、procmail.rc で次のようなルールを設定しているとなんとメールが2通届くことを知りました。どうして、まったく同じメールが2通届くのか原因が分からず困っていましたが、あっさり解決できました。

:0c

* ^From:.*hoge@example.com 

{

  :0 c

  ! naoya@example.com

}

このルールを応用すると、数通同じメールを送る用途も考えられると思います。