Browse Month: November 2008

svk を導入してみた

最近、subversion で管理されているプロジェクトを、オフラインで開発していていたり、チームのコードを自分なりに変更して元に戻したりすることが多くなってきたので svk を導入してみた。

環境は、OSX 10.5。

まず、svk を mac ports 経由でインストールする.

  1. $ sudo port -d sync
  2. $ sudo port install svk
次のようなエラーがでたので、perl 5.8 を deactivate してみる。
Error: Target org.macports.activate returned: Image error: /opt/local/lib/perl5/5.8.8/Getopt/Long.pm is being used by the active perl5.8 port.  Please deactivate this port first, or use the -f flag to force the activation.
$  sudo port deactivate perl5.8
deactivate してみると、今後は perl がないとうエラーになってしまうので、-f オプションで強制にインストールしてみた。
$ sudo port -f install svk
インストールにはけっこう時間がかかるが、インストールは正常に終了したっぽい。-v オプションで確認してみる。OSX には、デフォルトで一つ前のバージョンの svk が /usr/bin に入っているので要注意。
$ svk -v
This is svk, version v2.0.2 (using Subversion bindings 1.5.4)
動いている様子。subversion は、1.4.4 の binding を使っているっぽいけれど、同じバージョンの subversion で管理されているので問題なし。
まず、svk 用のリポジトリを作成する。
$ svk depotmap –init
Repository /$HOME/.svk/local does not exist, create? (y/n) y
svk の使い方については、help で確認する。
$ svn help
さっそく、対象の subversion のリポジトリを svk でミラーする。
$ svk mirror svn+ssh://example.com/myproject/trunk //mirror/myproject
Mirror initialized.  Run svk sync //mirror/myproject to start mirroring.
$ svk sync //mirror/myproject
Committed revision 1 from revision 1.
svk でミラーを開始すると、リポジトリからローカルの //mirror へ順番にコミットが行われる。
ミラーが終了したら、ミラーの状態をみてみる。
$ svk mirror –list
Path           Source
========================================================================
//mirror/myproject   svn+ssh://example.com/myproject/trunk
ミラーは、定期的にリモートサーバ上のリポジトリと同期する必要がある。同期するには、sync を使う。
$ svk sync //mirror/myproject
複数のミラーがあって、まとめて同期したいときには、–all オプションを使えばいい。
$ svk sync –all
さて、さっそく編集作業を開始するために、ミラーからコピーする。ミラーからチェックアウトすると直接リモートのリポジトリにコミットされてしまうらしい。
$ svk mkdir //work
Waiting for editor…
Waiting for Emacs…
$ svk copy //mirror/myproject //work/myproject
Waiting for editor…
Waiting for Emacs…
Committed revision X.
$ svk checkout //work/myproject $HOME/myproject
コピーから checkout できた。info コマンドを使うと、その作業コピーの情報をみることができる。
$ cd $HOME/myproject
$ svk info
Checkout Path: $HOME/myproject
Depot Path: //work/myproject
Revision: X
Last Changed Rev.: X
Copied From: /mirror/myproject, Rev. X
Merged From: /mirror/myproject, Rev. X
あとは、変更したら svk commit で、ローカルにコミットすることができる。add なども、subversion と同じ間隔で使うことができる。
そして、オンラインになったとき、リポジトリにローカルの変更を追加したい場合は smerge を使う。
$ svk smerge -C //mirror/myproject //work/myproject
$ svk smerge -l //mirror/myproject //work/myproject
-C はコンフリクトがないかどうか判定するオプション、-l はローカルへコミットしたログを自動的にリモートのリポジトリへのコミットログをして入れてくれるオプションという意味。
今までなんで使わなかったのだろうかと思うくらい便利です。

Apache HTTPD Server 2.2.10

先日、Apache HTTPD Server 2.2.10 がリリースされたわけですが、ChangeLog を眺めていたら、いくつか気になる変更点がありました。

それは、

  • mod_proxy_balancer: Add ‘bybusyness’ load balance method. [Joel Gluth , Jim Jagielski]
  • mod_proxy: Add connectiontimeout parameter for proxy workers in order to be able to set the timeout for connecting to the backend separately.PR 45445. [Ruediger Pluem, rahul ]

の二つです。

まず、最初の mod_proxy_balancer に「bybusyness」というロードバランサの振り分けメソッドが追加されたという内容です。mod_proxy_balancer といえば、Apache HTTPD Server でかかせない L7 ロードバランサのモジュールです。mod_proxy_balancer の該当ドキュメントをみると、ProxyPass ディレクティブに次のように振り分けメソッドを定義できます。

ProxyPass / balancer://hotcluster/lbmethod=bybusyness

lbmethod のデフォルト値は、byrequests となっていて、byrequests とはバックエンドのウェブサーバにリクエスト回数で重み付けする振り分け方法が選択されます。その他の選択肢には、bytraffic があります。bytraffic は、転送量で重み付けする振り分け方法です。そこに、2.2.10 から bybusyness という選択肢が追加されました。bybusyness は、ドキュメント原文では「perform pending request balancing」となっているので処理待ちのリクエスト数で重み付けする方法のようです。

ProxyPass を使っている場合は上の設定でいいですが、mod_rewrite を使っている場合は Proxy ディレクティブの中で設定することができます。

<Proxy balancer://neoad>
balancermember http://web1.example.com loadfactor=10 keepalive=off retry=2
balancermember http://web2.example.com loadfactor=10 keepalive=off retry=2
ProxySet lbmethod=bybusyness
</Proxy>

設定したら、ちゃんと lbmethod が確認されるが知るために、次のような感じで balancer-manager を設定します。

ProxyPass /balancer-manager !
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>

Allow from は、自分がアクセスする接続元の IP アドレスを書くか、認証をかけるようにしてください。

設定したら、Apache HTTPD Server を再起動して、/balancer-manager にアクセスします。アクセスしたページに次のようななっていれば設定はできています。

LoadBalancer Status for balancer://example
StickySession Timeout FailoverAttempts Method
–                   0            1                         bybusyness

さっそく、bybusyness の動作確認をみてみる。

接続したバックエンドのサーバが分かるように s1、s2 と出力するようにしておいて、curl を 10 回連続で実行させてみる。

bybusyness の前に、byrequest で確認する。

通常稼働時

s1
s2
s1
s2
s1
s2
s1
s2
s1
s2

順番にラウンドロビンされている。

意図的に s1 をダウンさせたとき。

s2
s2
s2
s2
s2
s2
s2
s2
s2
s2

あたりまえだが、s2 のみ。s1 を復帰させて retry 時間がたったあと。

s2
s1
s2
s1
s2
s1
s2
s1
s2
s1

ちゃんと s1 が復帰した。

次に bybusyness で同じように試してみる。

s1
s2
s1
s2
s1
s2
s1
s2
s1
s2

次に s1 をダウンさせる。

s2
s2
s2
s2
s2
s2
s2
s2
s2
s2

次に s1 を復帰させて、retry 時間待つ。

s2
s2
s2
s2
s2
s2
s2
s2
s2
s2

あれ?おかしい、s1 が復帰しない。しばらく待ってみたが、プロキシを再起動しない限り、s1 は復帰しなかった。balancer-manager をみてみても Status が OK のままになっているにもかかわらず、s1 にはまったく振られない。

理由を知りたいと思ったので、ソースコードをみてみた。modules/proxy/mod_proxy_balancer.c の 1100 行目に find_best_bybusyness という static 関数がある。おそらく、この関数で行っている処理だと思うので念入りに観てみた。とても短く、シンプルな関数だが、Apache のソースコードをみるのは初めてなのでよく分からないが、関数の最後にデバッグログを出力していること、バックエンドのサーバが選ばれるところは、次のようになっていた。

if (!mycandidate
|| worker->s->busy < mycandidate->s->busy
|| (worker->s->busy == mycandidate->s->busy && worker->s->lbstatus > mycandidate->s->lbstatus))
mycandidate = worker;

この busy と lbstatus の内容はデバッグログで出力されているので、デバッグログを出力するようにしてみた。デバッグログは、LogLevel debug を追加する。LogLevel は、ErrorLog ディレクティブの前に設定したほうがよい。

通常稼働時のログでは、次のように出力されている。

[Tue Nov 18 01:42:33 2008] [debug] mod_proxy_balancer.c(1173): proxy: bybusyness selected worker “http://s1/” : busy 0 : lbstatus 0

[Tue Nov 18 01:43:03 2008] [debug] mod_proxy_balancer.c(1173): proxy: bybusyness selected worker “http://s2/” : busy 0 : lbstatus 10

busy がどちらとも 0 なのでラウンドロビンされている。

s1 を落として、デバッグログをみてみる。

[Tue Nov 18 01:44:20 2008] [debug] mod_proxy_balancer.c(1173): proxy: bybusyness selected worker “http://s2/” : busy 0 : lbstatus 10

s1 を復帰させてみる。

[Tue Nov 18 01:46:00 2008] [debug] mod_proxy_balancer.c(1173): proxy: bybusyness selected worker “http://s2/” : busy 0 : lbstatus 0

s1 を復帰させて、接続したとき s1 が復帰したデバッグログは出力されるが、lbstatus がマイナスになっていた。

[Tue Nov 18 01:51:05 2008] [debug] mod_proxy_balancer.c(1173): proxy: bybusyness selected worker “http://s2/” : busy 0 : lbstatus -30

そのあと、s1 のオフオンを繰り返すたびに s2 の lbsatus が -10 ずつ減っていって、s1 を復帰させた直後の接続しても s1 が復帰したというデバッグログが出力されない。

byrequests で試してみると、s1 が復帰した直後の接続すると、次のようなログが出力される。s1 の lbstatus は 0、s2 の lbstatus は 10 になっている。

[Tue Nov 18 01:56:51 2008] [debug] mod_proxy_balancer.c(1008): proxy: byrequests selected worker “http://s1/” : busy 0 : lbstatus 0
[Tue Nov 18 01:56:51 2008] [debug] mod_proxy_balancer.c(543): proxy: BALANCER (balancer://test) worker (http://s1/) rewritten to http://x1/
[Tue Nov 18 01:56:51 2008] [debug] mod_proxy.c(988): Running scheme balancer handler (attempt 0)
[Tue Nov 18 01:56:51 2008] [debug] mod_proxy_http.c(1924): proxy: HTTP: serving URL http://s1/

busy という変数の意味を調べ観ると、どうやらリクエストを振り分ける前に ++ されて、リクエストが終わったあとに — されるという単純な整数値のようです。lbstatus という変数は、Balancermember ディレクティブの値がそのまま使われているようです。

とここまで調べて、Apache のバグとして上がっているかなと思って調べてみたが、すでにあがっていた

というわけで、bybusyness を使うとバックエンドのサーバが復帰しないという問題があるので使うのはやめておくことにしました。修正されるまでは、byrequests でいこうと思います。

mod_proxy_balancer のソースコードをすこし読んで、keepalived のように一定時間おきにチェックするのではなくて、HTTP リクエストがあったときに調べてどのサーバにリクエストを振り分けているということが分かりました。

振り分けを決めている find_best_XXX 関数は自分でも独自のルールで定義できそうです。

次に気になった connectiontimeout というのは、mod_proxy の ProxyPass 変数で定義できる値です。原文を要約すると、バックエンドのサーバに接続するまでのタイムアウト時間を秒単位で指定する設定です。すでに、timeout や retry という設定があって同じような意味で困惑しますが、timeout はバックエンドのサーバに / リクエストを送ったときのタイムアウト時間、retry はバックエンドのサーバが復帰させるときのリトライ時間です。

ということで、次のように設定することにしました。

<Proxy balancer://test>
balancermember http://s1/ loadfactor=10 retry=7 connectiontimeout=2
balancermember http://s2/ loadfactor=10 retry=7 connectiontimeout=2
</Proxy>

サーバの設定は、一度稼働したらメンテナンスを計画しない限りずっとそのままなので、最初に気合いを入れてしっかりと設定したいものです。

アメリカの真実

久しぶりに、とても興味深く考えさせられる本を読んだ。「超・格差社会アメリカの真実」この本は、スタンフォード大学に留学したのが初めての海外という小林由美氏によって書かれたアメリカ社会の構図について詳しい考察がされている本。

最初の方は、富の格差について具体的な数字を上げながら紹介されていて、後半は教育環境からアメリカ人の考え方や筆者の体験談などが紹介されていた。

アメリカという社会に興味のある人は、必読の一冊だと思う。

 

 

まくおさんを試してみた

先日のサーバインフラ Tech Meeting で、安井さんが公開すると宣伝していたファイルコピーツール「まくおさん (Multicasts All-Kinds of Updating Operation for Servers on Administered Network)」が公開されたので、さっそく試してみた。

環境は、CentOS 5.2 x86_64 です。

  • ソースコードを sourceforge からダウンロードする
  • ソースコードを展開する
  • ./configure && make する、問題なくコンパイルが通る
  • init スクリプトがないっぽいので、作ってみた
  • RPM にしたかったので、SPEC も作ってみた
  • init スクリプトを追加したまるおさんの tarball を作って、_topdir/SOURCES に入れる
  • rpmbuild -ba makuosan.spec して、RPM を作る
  • 作った RPM をインストールする
  • /etc/sysconfig/makuosan に、ベースディレクトリ (BASE_DIR) の設定をする
  • sudo /etc/init.d/makuosan start する(sudo しているのはかなり微妙かもしれないが、lock ファイルを作っているので必要)

これでまくおさんを起動したので、さっそく動作確認

$ /usr/bin/msync –members

1.0.0: s1.example.com  192.168.1.1
Total: 1 members

認識している。さっそくファイルを転送してみる。

$ /usr/bin/msync -r

-v を指定しないと、何も表示されないが確認してみるとちゃんとコピーされている。ちょっと試した感じだと非常に便利なので、実際のシステムで使うように引き続き検証をしておく予定。あと、FreeBSD でも動かせないか調べてみたい。

今までは、社内の自作シェルスクリプトで rsync していたので、サーバ情報の管理がかなりめんどうだったけれど、まくおさんを使うとファイルをコピーするということに限ってはかなりシンプルになりそう。

せっかくなので、作った RPM を公開しておきます。ダウンロードした RPM のファイル名がおかしいので、なおしてください。正しくは、makuosan-1.0.0-1.x86_64.rpm です。

init スクリプトと SPEC がソースコードに含まれることに期待しています。

こんな素敵なツールを作って公開してくださった KLab Inc. の安井さんに感謝!!!

# 追伸

設定している途中で、「まくおさん」なのか「まるおさん」なのか、自分の中で勝手に混乱しまった。。。個人的には「まるおさん」の方が覚えやすい><

英英辞典 on iPhone

最初、英語の勉強のために電子辞書を買おうかなと思っていたけれど、けっこう高いし、辞書が別に携帯するのがいやなので、iPhone でないかなと思って調べてみた。そうすると、意外にもたくさんの選択肢があった。
個人的に英英辞典でポイントなる項目は、次のとおり。

  • 収録語数
  • Native の発音を聞くことができることか
  • 米国英語、英国英語、の発音記号を表示できるか
アプリケーション名 収録語数 発音を聞けるか 発音記号 価格 iTMS URL
Cambridge Advanced Talking Dictionary 約19万語 米国、英国、どちらでも聞ける 米国、英国、どちらもあり \2,500 URL
Concise Oxford Dictionary 約24万語 あり(Oxford なので英国のみの可能性が高い) なし \2,900 URL
Merriam Webster Collegiate Dictionary 約22.5万語 なし あり \2,900 URL
American Heritage® Dictionary – Fourth Edition 約7万語 あり あり \3,500 URL

こんな感じでした。すべて有料なので気軽に試せなかったので、上から検討した結果「Cambridge Advanced Talking Dictionary」を初の iPhone 有料アプリとして購入してみました。

米国、英国、両方の発音記号と実際の発音を iPhone で見れて聞けるのでこれからも重宝しそうです。

その他にも和英や英和もかなり充実しているし、無料の英英辞典も english とか dictionary とかで検索するとたくさんあるので使ってみるといいかもしれません。カテゴリでいうと、Reference、Education、などに属していますね。

CAMBRIDGE Advanced Learnes's Dictionary

CAMBRIDGE Advanced Learnes's Dictionary

追伸:
iPhone アプリのアイコンは、どうやってブログに張るのだろうか。。。

ネットプリントサービスが便利

セブンイレブンで展開しているネットプリントというサービスが、とても便利で感動した。
このネットプリントというサービスは、富士ゼロックスがやっている。

使い方は、次のとおりでとても簡単で自宅にプリンタがない僕の場合はかなり重宝するサービスになった。

  • ネットプリントにユーザ登録(無料)する
  • ネット プリントのプリントしたいファイルをアップロードする(エクセルや PDF などに対応している、対応している用紙サイズでないと自動的にエラーになるのでとても親切)
  • ファイルをアップロードすると発行される登録キーをメモする
  • あとは、全国のセブンイレブンで登録キーを入力するだけで印刷をすることができる
  • 料金は、ここに書いてあるとおりで、モノクロA3やA2で1枚20円というリーズナブル、さらに実際に印刷してみると会社のプリンタよりもきれいに鮮明にきれいに印刷できる

netprint

こういう身直に精通しているウェブサービスは、本当に便利だと思うが、こういったサービスは普通の人たちが使うので簡単に使えなければならない。

iPhone を買った

今年も、無事誕生日を迎えることができた。誕生日の日は、会社の同僚と元同僚たちに大好きなベルギービールでお祝いしてもらって、すばらしい時間を過ごすことができた。

自分への誕生日プレゼンとして、もうすでに祭りは終わっているけれど iPhone を買った。iPhone は、電話というより、個人的にアプリケーションを本格的に作りたくなったからだ。iPhone を新規契約したが、何の問題もなく在庫もあって、運転免許証と運転免許証の住所と現住所が違う場合は公共料金の領収書と月々の支払いに必要なクレジットカードだけで問題なく契約ができた。契約時間は、店員さんが慣れていたということもあって、約30分ほどで終わった。iPhone のパッケージは自分で開封するのだけれど、みごとに箱の一部をはがしてしまった。箱は必要なのかよく分からないが、ちょっとやってしまったと思った。わざわざ自分で開封させる意味が、ちゃんと理解できてよかった。

DSC_0001.JPG

全損がかなり怖いので、Apple Care には加入しておいた。白か黒かすこし迷ったが、16GB の黒にした。

購入した直後の iPhone は、バージョンが 2.0系でバッテリーもほとんどない状態がだったが、USB 電源アダプターは新しいものに交換されていた(あたりまえか)。

家に帰ってから、iPhone をバージョンアップしようとして、ファームウェアをダウンロード開始したところで寝て朝起きたら iPhone にロックがかかってしまい、緊急電話しか使えないただの箱になってしまった。

近くのソフトバンクショップに修理のお願いに行ったら、iPhone テクニカルサポートに確認しないと交換できませんと言われてしまう。ちょうど行ったのが土曜日の5時すぎということで、タイミングよくテクニカルサポートが終了していた。ショップから交換品を取り寄せておくので、翌日テクニカルサポートに確認して、それでもダメならまた来てくださいと言われた。今日みたいな日も日割で料金が発生しているんだよなと不満をかかえつつも、翌日テクニカルサポートに午前10時頃に問い合わせしてみた。テクニカルサポートで、確認されたことが次のとおり。ちなみに、前日にすべて自分で試していた。

  • OSX のバージョンは最新ですか? -> 最新の 10.5.5 です
  • iTunes のバージョンは最新ですか? -> 最新の 8.0.1 です
  • SIM カードを抜き差しして症状が変わらないですか? -> (すでに5回くらいやっていたが、念のためちゃんとやって)症状が変わりません

これだけかと思いつつも、予想通りロックがかかりっぱなしだったので、ショップに行った。ショップに行ったら、Apple Care から交換品が届いて SIM カードをショップで用意されているものに交換してみたが症状が変わらないということで本体を無料で交換してもらった。もし、Apple Care に入っていない場合は、90日を過ぎると有償になるとのこと。Apple Care に入っていると、それが2年に延長されるとのこと。

新品に交換しても、iPhone のバージョンは 2.0 系のままだったので家に帰ってからバージョンアップしたら、今度はすんなりとバージョンアップすることができた。

今まで、ずっと iPod Touch 1G を持っていたが、いろいろと違っていることが多いので、同梱はされていないが iPhone の説明書を一通り読みながら実際に操作してみた。このあたりの情報は、iPhone 3G Wiki によくまとまっている。

この説明書も、iPhone のアプリとして入れてくれればいいのにと思ったが、もし作ったら確実に Reject されそうだが PDF を iPhone の表示用にフォーマットしなおさないといけないでできるかどうか調べてみたい。

一通り操作をしてあと、いろいろとアプリを入れて遊んでみた。日本製のはブログなどでかなり紹介されているが、海外製のは適当に探しながら入れてみた。ユニクロのアプリは Wifi を使ってもダウンロードに時間がかかりすぎなのと、起動や動作も重いので速攻で削除した。アプリを作るときには、アプリサイズも重要なポイントになるだろうと実感した。

海外製でよくできたアプリとしては、 SmugShot というサイトが提供しているアプリ。 iPhone のカメラで撮影した写真をアップロードできたり、iPhone からアカウントを登録できたりと、かなり使いやすかった。iPhone のカメラで撮影した写真をアップロードするアプリを作るときには、このアプリを参考にしたいと思った。

iPhone を堪能したあと、iPod Touch 1G を JB してみようと iPod Touch を初期化してから、Pwnagetool なるものを使ってみたが DFU モードに入ってもカスタムファームウェアをインストールすることができなかった。そろそろ、2.2 が登場しそうなので、また機会をみて試したいと思う。iPhone は、JB するリスクがけっこうありそうなのでやめておいた。

そして、下の写真は最初のが iPod Touch 1G、次のが iPhone 3G のもの。iPhone 3G はインストールしたアプリが最初の画面に来ないように工夫してみた。

IMG_0001_2

IMG_0001_3

というわけで、まずは自社サービスの iPhone アプリか Flickr アプリ(どうしてないんだろう、サイトがあるかな)でも作ってみよう。