Browse Month: February 2008

vnstat を試してみた

コンソールベースのネットワークトラフィックモニター vnstat を試してみた。詳しい解説は、このブログにある。

さっそく、インストールしてみた。

$ sudo portinstall vnstat

/usr/local/sbin/portinstall:880:in `get_notinstalled_depends’: undefined method `each’ for nil:NilClass (NoMethodError)
from /usr/local/sbin/portinstall:768:in `main’
from /usr/local/sbin/portinstall:746:in `each’
from /usr/local/sbin/portinstall:746:in `main’
from /usr/local/lib/ruby/1.8/optparse.rb:1303:in `call’
from /usr/local/lib/ruby/1.8/optparse.rb:1303:in `parse_in_order’
from /usr/local/lib/ruby/1.8/optparse.rb:1299:in `catch’
from /usr/local/lib/ruby/1.8/optparse.rb:1299:in `parse_in_order’
from /usr/local/lib/ruby/1.8/optparse.rb:1247:in `catch’
from /usr/local/lib/ruby/1.8/optparse.rb:1247:in `parse_in_order’
from /usr/local/lib/ruby/1.8/optparse.rb:1241:in `order!’
from /usr/local/lib/ruby/1.8/optparse.rb:1234:in `order’
from /usr/local/sbin/portinstall:565:in `main’
from /usr/local/lib/ruby/1.8/optparse.rb:785:in `initialize’
from /usr/local/sbin/portinstall:229:in `new’
from /usr/local/sbin/portinstall:229:in `main’
from /usr/local/sbin/portinstall:2170

エラーがでてしまった。

vnstat が ports にあるかどうか調べてみる。

$ whereis vnstat

vnstat:

あれ?ない。でも、ports にはちゃんと存在している。

$ ls /usr/ports/net/vnstat

ls: /usr/ports/net/vnstat: No such file or directory

うーむ、なんで家のサーバには入っていないのだろうか。

おかしいと思って、portsnap してみたら、入った!

$ sudo portsnap update

portsnap  を cron に設定している場合は、手動で update する必要があるのか・・・。

気を取り直して、もう一度インストール。

$ sudo portinstall vnstat

===>   Registering installation for vnstat-1.6_2
===>  Cleaning for vnstat-1.6_2
[Updating the pkgdb <format:bdb_btree> in /var/db/pkg … – 179 packages found (-0 +1) . done]

無事インストール完了!

vnstat を cron に設定して、統計を取るコマンドを実行してみた。5分おきだと早すぎるので、1日おきにしてみた。

$ sudo vnstat -i bge0 -m
bge0  /  monthly

month         rx      |      tx      |   total
————————-+————–+————————————–
Feb ’08          0 kB  |        1 kB  |        1 kB   ::::::::::::::::::::::
————————-+————–+————————————–
estimated        —     |       —     |       —

なるほど、これは面白いツールだ。

週末に読んだ本

今週は、二冊の本を読んだ。 一冊目は、岡野さんの「学校の勉強だけではメシは食えない!」という本。岡野さんといえば、 携帯電話のリチウム電池ケースや痛くない注射を開発した人で有名です。いくつか心に残るメッセージがありました。

  • やりたいことを仕事にした方がいい、そしてずっと現役でいられるような仕事がいい
  • 質の高い仕事をすると、次は向こうから新しい仕事が来る
  • 企業に所属している人は、独立を考えよう
  • 従業員を増やしたり、売り上げを伸ばすことだけが会社の成長ではない(岡野さんの会社はずっと六人の従業員だそうです)
  • 自分の会社をもったら、従業員には上から下までまかせよう
  • 休日は家に閉じこもっていないで、いろいろな場所へ出かけよう
  • 自分で実際に試しながら、試行錯誤的を繰り返してみよう

ずっと現役でいられる仕事かー、もし本当にあるのなら見つけたいですね。見つけたいというよりも、いまの仕事を全力でやってみて自分でどう感じるかが大事なのかもしれません。   

   二冊目は、茂木さんのベストセラーの「脳を活かす勉強法」。 この本がいいたいことも岡野さんの本と同じだと思った。退屈な勉強方法をとるよりも、自分が楽しいと思える勉強法を編み出すことが大事。朝に勉強するのが基本だが、短い空き時間でも集中して勉強すると勉強する時間を確保できる。そして、よく寝ることも大事とのこと。     僕はけっこう自己啓発系の本を読むことが多いけれど、このくらいにしておこう。あとは行動あるのみだ。   

FreeBSD で RAID を組んでみた

家のサーバには、けっこう消えては困るデータが増えてきたので、FreeBSD で RAID を組んでみようと思い立ちました。

僕は以前、ハードウェア RAID (IDE) を使っていたことがあったので、今後もハードウェア RAID(SATA) にしてみようと思いました。コストパフォーマンスのいいハードウェア RAID カードがないかと調べてみたところ、玄人志向の <a href=”http://www.kuroutoshikou.com/products/serialata/sata2ri2-pciefset.html”>SATA2RI2</a>を購入しました。

早速マシンに RAID カードを装着して、BIOS 上から RAID1 を組みました。その後、FreeBSD をインストールしたのですが、ad4 と ad6 といったデバイス(普通は、ar0 が見つかるはず)しか検出されませんでした。おかしいなと思って調べてみたところ、このカードは FreeBSD では対応していないことが分かりました。僕は、てっきりハードウェア RAID なら OS は関係ないと思いこんでいたので、失敗してしました。

仕方がないので、ハードウェア RAID カードを装着したままの状態で、FreeBSD 上でソフトウェア RAID を設定してみました。FreeBSD のソフトウェア RAID は、ataraid と gmirror という二つの選択肢があるようです。僕は、gmirror を選択してみました。

gmirror の設定手順は、次のとおりです。FreeBSD は、/dev/ad4 にインストールしてある状態で、ミラー用のハードディスクは /dev/ad6 になります。

  1. FreeBSD のインストール CD から、Fixit モードで起動する(Fixit モードで起動するには、別の Live filesystem CD が必要)
  2. Fixit モードで起動したら、順番に次のコマンドを実行する
  3. chroot /dist
  4. kldload geom_mirror
  5. exit
  6. gmirror label -v gm0 /dev/ad4
  7. gmirror insert -v gm0 -b round-robin /dev/ad6(ここで、データの同期が始まる、500GB だと 1 時間程度かかる)
  8. gmirror status  や gmirror list で、同期が完了したことを確認する
  9. mount /dev/mirror/gm0s1a /mnt
  10. sed -i bak /s/ad4/mirror\\/gm0/ /mnt/etc/fstab
  11. echo ‘geom_mirror_load=”YES”‘ >> /mnt/boot/loader.conf
  12. あとは、Fixit モードを終了して、再起動して正しく gm0 からブートできることを確認する

なぜか、ハードウェア RAID カード を装着したままの状態だと、gm0 からブートすることができななかったので、ハードウェア RAID カードをはずして対策しました。安いハードウェア RAID カードはあまり信頼できないという情報もあったので、個人用途などのサーバではソフトウェア RAID がよさそうですね。
gmirror の man はなぜかないので、<a href=”http://man.cx/gmirror(8)”>このページ</a>などで確認することができます。gmirro では、-b オプションで読み込むときの負荷分散アルゴリズムを設定することができます。実験結果が、<a href=”http://www.muranet.jp/~mura/blosxom.cgi/bsd/raidtest.html”>mur’s blog</a> に公開されていたので、とても参考になりました。

以前、会社の開発用 Linux  サーバにはソフトウェア RAID を組んでいたのですが、片方のハードディスクが壊れたことがありました。そのときは、ソフトウェア RAID だったので片方のハードディスクを交換するだけで助かったことがありました。ハードディスクは、消耗品なので、特にサーバは RAID を設定しておくことをおすすめします。

Dovecot + fetchmail + procmail で快適な IMAP 環境を整える方法

家のサーバに、新しい仲間 “mac mini” が加わったので、家の PC の環境を再構築中です。その中で、まずメールまわりの環境構築を行っています。

プライベートと会社のメールサーバは、別々に存在していますが、家のサーバ一台でまとめて IMAP で管理したいと思い立って、IMAP 環境を構築してみました。使ったソフトウェアは、Dovect と fetchmail と procmail の定番オープンソースです。

まずは Dovecot 側の設定です。Dovecot には、バーチャルユーザを設定できる機能があるみたいなので、初めてだったけれど設定してみました。この機能を使ってみようと思った理由は、メールを受信するアカウントとシステムアカウントは別々で管理したいからです。

この機能についての詳しい説明は、この記事に詳しい説明があったので参考にさせてもらいました。僕が実際に行った手順を説明すると、次のとおりです。

  1. Dovecot の設定ファイル dovecot.conf の auth default の項目を mechanisms を cram-md5、passdb passwd-file に dovecot 専用パスワードファイル、user static に dovecot 向けのユーザ情報を設定します
  2. user static の設定は、他の資料では存在しないユーザID を設定するのが普通なのですが、僕の場合は fetchmail を実行したかったので、fetchmail を存在するユーザ IDに設定しました
  3. dovecot 専用のパスワードファイルは、dovecotpw コマンドを使うと便利です、ここですこしはまってメールアドレスをユーザ名と指定してしまうと認証することができませんでした、ユーザ名だけにすると認証することができました
  4. あとは、fetchmairc の設定 mda を、mda “/usr/local/bin/procmail /home/hoge/.procmailrc” という感じで、それぞれのメールボックスに procmail を使って振り分けるようにしておきます

あとは、それぞれ fetchmail を cron あるいはデーモンで実行するように設定するだけです。cron の場合、それぞれの fetchmail が同時に動くとエラーになるので、順番に fetchmail を実行するシェルスクリプトを cron に登録しておくといいでしょう。

最後に、このサーバに送られるメールも .forward に、プライベート用の fetchmail を実行するように、次のように書いておきました。

“|IFS=’ ‘ && exec /usr/local/bin/procmail /home/hoge/.procmailrc -f- || exit 75”

これでずいぶん快適な IMAP 環境が整いました。

DeNA テクノロジーセミナーへ行ってきた

昨日、開催された DeNA テクノロジーセミナーへ行ってきました。当初の予想を大きく上まわる応募があったようで、 会場にはたくさんの人たちがきていました。

DeNA へ行く途中ですこし迷ってしまって、15 分ほど遅れてしまい、一番興味のあった MySQL の話をあまり聞くことができませんでした。今回の資料が公開されるといいのですが・・・。

以下、メモとして書いておきます。まずは、MySQL まわりの話から。

  • MySQL は、バージョン 5.0.45 を使った master-slave 構成(5 系には最近移行したらしい、あわせて OS も 32bit から 64 bit に変更した)
  • OS は、CentOS4(CentOS 5 にしたいと言っていた)
  • master が落ちたときの予備のサーバとして、別途バックアップするサーバがある
  • Slave には、読み込み専用のユーザしか設定しない(なので、master に昇格させるときは書き込み専用のユーザを作成する必要がある)
  • モバゲーでは、日々増え続けるデータに対しては、テーブルの分割を行っている
  • テーブルの分割やインデックス、カラムの追加の作業があるときは、サービスの停止時間を最小にするための工夫をしている(自家製スクリプトがあるとのこと)
  • レプリケーションの遅延は、すべてのデータベースに現在時刻が入っているテーブルを用意して、専用のデーモンで更新をかけている(時刻の差でレプリケーションの遅延を監視している)
  • JOIN は、まったく使っていない
  • 全文検索エンジンは、Senna を使っている(1.0.x は不安定だったことがあったみたいだが、1.1 系にしてからは安定しているとのこと、パフォーマンスも問題がないとのこと)
  • 全文検索エンジンは、専用の Slave を用意している(検索用のデータは、MyISAM テーブルを使ってみる様子)
  • データベースサーバは、メモリ 16GB 搭載 Xeonで、innodb_buffer_size = 12GB を指定している(Flickr のデータベースサーバと同じメモリ容量!)
  • memcached は使っていない
  • 監視まわりは、MRTG と自家製スクリプトで行っている
  • MyDNS を使っている
  • サーバ台数は、200 台くらいの規模とのこと
  • サーバのインストールは、PXE ブートを使ってインストールしている
  • サーバの追加は、MyDNS に設定を追加するだけ
  • プログラムの配布などは、rsync を使っている

次に、絵文字とテンプレートエンジンまわり

  • モバゲーは、会員数 903 万人、PV 151 億/月くらいの規模(1日 5 億くらいの PV がある、天気の悪いときは PV がかなり上がるとのこと)
  • 3 キャリア対応、ウィルコムは未対応(セキュリティによる理由)
  • モバゲーは、ほとんど perl で書かれている
  • 絵文字の対策として、データベース内はすべて ShiftJIS で格納している
  • 絵文字のマッピングは、独自で行っている(最低限のルールとして、入出力が同じキャリアのときは確実に表示できるようになっている)
  • 絵文字のマッピングでどうしてもマッチしない場合は、カタカナなど工夫している
  • テンプレートエンジンは、自家製のもの
  • ドコモ向けに XHTML を出力するようになっている
  • テンプレートエンジンは、軽く、速く、動作するように設計されている
  • 文字サイズの差異は、苦慮しているとのこと
  • 動画変換は、市販のエンコーダーを入れていて、キャリアごとに生成している
  • 画像は、ImageMagick を使って普通にリサイズしている
  • 動画や画像は、すべて目視で監視している
  • 日々やりとりされるテキストデータ(メールや日記など)には、茶筅を使って特定のキーワードを抽出している

というような感じです。意味不明な部分もあると思いますが、ご了承ください。

Emacs から sudo 経由でファイルを編集する方法

昨日の社内 LT で、とあるエンジニアから「sudo するときは vi を使いますよね?だから、最近 vi でいい気がしてきた」という痛い発言が出ました。

Emacs を愛用している人として、とても悔しいと思って試してみました。

Emacs から sudo 経由でファイルを編集するときは、tramp を使います。以下、tramp のインストールと設定手順です。

以下、作業手順

  1. 本家サイトより、tramp 2.1.9 をダウンロードする
  2. 展開してから、./configure –with-contrib && make && make clean する
  3. tram-2.19 ディレクトリ全体を、ロードパスの通った場所におく
  4. Emacs を起動してから、M-x tramp-version をして tramp のバージョンを確認する
  5. ここに書いてあるとおり、C-x C-f /sudo::ファイル名 と実行すると、sudo 経由でファイルを編集することができます!

しかし、zsh でプロンプトを自己流に設定していると動かないので、プロンプトを設定している人はシェルの設定ファイルを見直す必要があります。

tramp 経由だと、TERM 環境変数が “dumb” に設定されるので、”dumb” のときはプロンプトを変更しないように、次のような感じで .zshrc を変更します。

if [ “$TERM” != “dumb” ]; then
PROMPT=’左プロンプトの設定’

RPROMPT=’右プロンプトの設定’

fi

これで vi を使う機会がめっきり減ってしまいますが、とても最強で、かつとても幸せです。これで個人的な作業効率がかなりあがるではないかと思います。

tramp は、この他にも ssh もあるので、Emacs がインストールされていないサーバ上のファイルも編集することができます。

たまには時間をとって、普段使っているツールを整備することは本当に大事ですね。

Emacs 22 rpm に失敗した話

CentOS 5 では、yum install emacs とすると、Emacs 21 がインストールされてしまう。僕は、ずっと Emacs 22 を使っていたので、Emacs 22 を rpm にしてみようと思った。
以下、作業手順

  1. sudo rpm -e emacs-common-21.4-19.el5   などとして、Emacs 21 を削除する
  2. gun のページから、最新版の Emacs 22.1 をダウンロードする
  3. 展開してから、./configure && make する
  4. sudo checkinstall する
  5. sudo rpm -ivh /usr/src/redhat/RPMS/i386/emacs-22.1-1.i386.rpm として、Emacs をインストールすると info パッケージがコンフリクトしていると言われてしまうので、–force をつけて強制的にインストールする
  6. Emacs を起動すると、Cannot open encoded-kb というエラーメッセージが表示される

調査してみると、どうやら /usr/share/emacs/22.1/lisp/international がインストールされていないエラーだった。どうにも解決策が見つからなかったので、./congiure –prefix=/opt/emacs として、/opt/emacs にインストールしたらちゃんと起動した。rpm にするのってけっこう難しいのね。

あと、checkinstall でエラーが出るときは、すでに生成されている spec ファイルを削除してから、make して checkinstall を実行すると大丈夫でした。