2009年12月31日木曜日

Mac OS X で 自分でインストールした Ruby が OS付属のものより遅い - 最適化・・・!

ことの発端は
・とある iso イメージのチェックサムが sha512 のものしか書かれてない

・sha512 に対応しているコマンドがない
(md5deep は hash, md5, sha1, sha256, tiger, whirlpool 、openssl は dgst, md5, md4, md2, sha1, mdc2, ripemd160)
NetBSD の digest が MacPorts にあればそれで済むのだけど、無い。(pkgsrc の導入はここでは考えない)
後で分かったけど、 gpg --print-md sha512 [filename] でできるなこれ・・・

・ruby でちょいと書けばよさげだ

ちょちょいとぐぐって

Digest::SHA512 - Rubyリファレンスマニュアル

Digest::Base - Rubyリファレンスマニュアル
を参考にした後、ひとまず目的は達成。

ふと 自分でインストールした Ruby と OS付属のとで time をとってみたところ、どーも自分で入れたのが遅い・・・。

以下の通り。

順に OS付属、MacPorts、自分で入れたもの

・バージョン
% /usr/bin/ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]

% /opt/local/bin/ruby --version
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin10]

% ~/local/bin/ruby --version
ruby 1.8.7 (2009-12-24 patchlevel 248) [x86_64-darwin10.2.0]

・バイナリ具合を file で確認
% file /usr/bin/ruby
/usr/bin/ruby: Mach-O universal binary with 3 architectures
/usr/bin/ruby (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/ruby (for architecture i386): Mach-O executable i386
/usr/bin/ruby (for architecture ppc7400): Mach-O executable ppc

% file /opt/local/bin/ruby
/opt/local/bin/ruby: Mach-O 64-bit executable x86_64

% file ~/local/bin/ruby
/Users/katsuji/local/bin/ruby: Mach-O 64-bit executable x86_64


・500M のファイルを用意して、sha512 チェックサムをとってみたときの time 結果
1回目
% time /usr/bin/ruby =sha512.rb ~/testfile >/dev/null
/usr/bin/ruby =sha512.rb ~/testfile > /dev/null 4.85s user 0.45s system 99% cpu 5.297 total

% time /opt/local/bin/ruby =sha512.rb ~/testfile >/dev/null
/opt/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.75s user 0.43s system 99% cpu 5.185 total

% time ~/local/bin/ruby =sha512.rb ~/testfile >/dev/null
~/local/bin/ruby =sha512.rb ~/testfile > /dev/null 9.78s user 0.52s system 96% cpu 10.717 total

2回目
% time /usr/bin/ruby =sha512.rb ~/testfile >/dev/null
/usr/bin/ruby =sha512.rb ~/testfile > /dev/null 4.84s user 0.44s system 99% cpu 5.287 total

% time /opt/local/bin/ruby =sha512.rb ~/testfile >/dev/null
/opt/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.75s user 0.44s system 99% cpu 5.205 total

% time ~/local/bin/ruby =sha512.rb ~/testfile >/dev/null
~/local/bin/ruby =sha512.rb ~/testfile > /dev/null 9.79s user 0.52s system 96% cpu 10.637 total

んー、倍くらい遅い。。。1.8.7-p174 も手で入れてみて計ってみようか・・・。


追記1:
1.8.7-p174 を入れた。やっぱり遅い。
% ~/local/ruby18-p174/bin/ruby --version
ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-darwin10.2.0]

% time ~/local/ruby18-p174/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174/bin/ruby =sha512.rb ~/testfile > /dev/null 9.66s user 0.45s system 99% cpu 10.116 total

% time ~/local/ruby18-p174/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174/bin/ruby =sha512.rb ~/testfile > /dev/null 9.67s user 0.46s system 99% cpu 10.211 total

ということは MacPorts のパッチ当てるとよいか?


追記2:
1.8.7-p174 を MacPorts のパッチあてて入れたのでリトライ。
だめだ。。相変わらず遅い。んっんー。

% time ~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null 9.71s user 0.44s system 99% cpu 10.183 total

% time ~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null 9.71s user 0.44s system 99% cpu 10.167 total

てーことは configure のオプション等がよろしくないのか?見直してみよう。


追記3:
判明。
最適化だった orz.... 見落としてた・・・。
前述の 1.8.7-p174 + MacPorts のパッチに加え、 CFLAGS に -O2 を追加したバイナリの場合↓

% time ~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null 4.72s user 0.44s system 99% cpu 5.172 total
% time ~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null 4.73s user 0.44s system 98% cpu 5.223 total


追記4:
というわけで 1.8.7-p248 を入れ直して OS付属の、MacPortsのとともに追試
入れ直しついでに、-O2 でなくてアグレッシブに -O3 にしたった。
MacPorts でのパッチは p174 のものがそのままでは p248 で使えないだろうと思ったので当ててない。

1回目
% time /usr/bin/ruby =sha512.rb ~/testfile >/dev/null
/usr/bin/ruby =sha512.rb ~/testfile > /dev/null 4.82s user 0.45s system 99% cpu 5.290 total

% time /opt/local/bin/ruby =sha512.rb ~/testfile >/dev/null
/opt/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.78s user 0.44s system 99% cpu 5.254 total

% time ~/local/bin/ruby =sha512.rb ~/testfile >/dev/null
~/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.69s user 0.44s system 99% cpu 5.139 total


2回目
% time /usr/bin/ruby =sha512.rb ~/testfile >/dev/null
/usr/bin/ruby =sha512.rb ~/testfile > /dev/null 4.82s user 0.44s system 99% cpu 5.269 total

% time /opt/local/bin/ruby =sha512.rb ~/testfile >/dev/null
/opt/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.78s user 0.44s system 99% cpu 5.238 total

% time ~/local/bin/ruby =sha512.rb ~/testfile >/dev/null
~/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.69s user 0.45s system 98% cpu 5.194 total

いいね!

まとめ(?):
OS付属のものやパッケージシステムを使わずに手で入れるとき、最適化を忘れると損をしてるかもしれないよ!(RedHat の Perl がパッチのせいで性能劣化してたことはあったけど・・・)

ちなみに OS付属のは -Os, MacPorts は -O2 だった

% /usr/bin/ruby -r rbconfig -e "p Config::CONFIG['configure_args']"
" '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--disable-dependency-tracking' '--enable-pthread' '--enable-shared' '--prefix=/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr' '--with-sitedir=/Library/Ruby/Site' 'ac_cv_func_getcontext=no' 'ac_cv_func_setcontext=no' 'CFLAGS=-arch i386 -arch x86_64 -g -Os -pipe -fno-common -DENABLE_DTRACE' 'LDFLAGS=-arch i386 -arch x86_64 '"

% /opt/local/bin/ruby -r rbconfig -e "p Config::CONFIG['configure_args']"
" '--prefix=/opt/local' '--enable-shared' '--mandir=/opt/local/share/man' '--enable-pthread' '--without-tk' '--with-vendordir=/opt/local/lib/ruby/vendor_ruby' 'CC=/usr/bin/gcc-4.2' 'CFLAGS=-O2 -arch x86_64' 'LDFLAGS=-L/opt/local/lib' 'CPPFLAGS=-I/opt/local/include'"

2009年12月30日水曜日

2009年は

友人の結婚式以外、ほぼ無かったことにしたいトシだったかな。

淀んだ汚泥にはまってずぶずぶ沈んでる感じで暗澹たる状況であった。

2009年12月28日月曜日

年末

帰省しない。

今年は、
・2008年末からの帰省
・GWに帰省(結婚式)
・秋に帰省(結婚式)

してたということもあり。

2005年(2004年の年末)て帰ってたっけなー。2006年以降は帰ってた。

入門 Objective-C 2.0

最近、入門 Objective-C 2.0 をちょいちょい読んでみてる。

前から興味はあったのだけど、iPhone アプリでもなんか作って遊んでみるかなーと思ったのがおおきい。
書籍自体はちょっと前に買っていて、しばらく寝かせていた。。

iPhone やら Mac OS X のプログラミングはさっぱりなので
・まず Objective-C をつかむ
・Cocoa の流儀をつかむ
・iPhone アプリの作り方をつかむ(Cocoa Touch ?)

という具合?うーむ険しい。
多少読み進めてみたところ、Java や C++ バリバリやってたひとはこの入門本は物足りないかも。

入門終えたらこれかな・・・
詳解 Objective-C 2.0

本業でないので、隙間時間で続けたいところ。

2009年12月27日日曜日

VMware Fusion 3.0.1




3.0.0 -> 3.0.1 にアップグレードした。12/10 にでてた。

VMware Fusion 3 Release Notes

あいふぉーん アプリ

ひさしぶりに無料のを漁ってみた。

結果、以下をげっと。

(iTunes Store が起動するよ)
基本六法 2010年版
TOKYO FM
ボキャキン(英単語"ゲーム"。"学習用"は有料、というパターン)

2009年12月20日日曜日

ギョーカイヨーゴ?

「“A m e b a な う” は T w i t t e r と カ ニ バ ら な い」

カニバらない・・・。
カニバリズムという言葉は知ってたけど、このように使うのは初めて見た。

それはそうと、永山氏かわいい。

2009年12月19日土曜日

Twitter 障害のアレ

(追記: techcrunch に手口が載ってる -> イランによる(?)Twitter攻撃の手口はこうだった )

Twitterブログ: 昨日のDNS障害についての追加情報

で、「DNS設定がハイジャックされました。」ということらしい。

発生時、Tweetie の更新が止まってたのでなんだろなーと思ってて以下を実行してみた
(けどスクリーンショットなどとってない、、)

・Twitter 専用クライアントでなくて ふつーのブラウザで閲覧
-> 遅かったのか、アラビア語や英語の「クラックしたぜ!」なのはみれなかった。ただタイムアウト。

・A RR ひいてみると NTT America なアドレスではなかった
(追記:そうそう、Firefox だと WorldIP でも入れておくと常に確認できていいよ。ふつーはこんな具合で NTT America なアドレス。)


復旧してほとぼりがさめたところで、個人的興味から以下調査(というほどでもないか)

NS レコードひけばすぐわかるけども、
最初に書いた追加情報にあるとおり、DNS は Dynect というとこのサーバがやってる。
% dig twitter.com ns +short
ns1.p26.dynect.net.
ns2.p26.dynect.net.
ns4.p26.dynect.net.
ns3.p26.dynect.net.

じゃ dynect てなにやさん?と、試しに www.dynect.net を見る。
http://dyn.com/dynect にリダイレクトされる。
CDN や DNS屋さん。GSLB て初めて見た。global server load balance か。

下のほうの Our Clients をみると、(自分の知っている)有名どころでは Twitter の他、bit.ly37signals がある。

というわけで bit.ly と 37signals.com の NS レコードを引いてみる
% dig 37signals.com ns +short
ns4.p25.dynect.net.
ns1.p25.dynect.net.
ns2.p25.dynect.net.
ns3.p25.dynect.net.
% dig bit.ly ns +short
ns1.p26.dynect.net.
ns4.p26.dynect.net.
ns2.p26.dynect.net.
ns3.p26.dynect.net.

おー。bit.ly は twitter.com とおなじネームサーバ。

やっぱり BIND かなー、バージョン問い合わせに答えてくれるかな?と思って引いてみたら答えてくれた。
% for i in $(jot 4 1); do echo "--- ns${i}.p26.dynect.net"; dig @ns${i}.p26.dynect.net version.bind chaos txt +short ; done
--- ns1.p26.dynect.net
"9.6.1-P1"
--- ns2.p26.dynect.net
"9.6.1-P1"
--- ns3.p26.dynect.net
"9.6.1-P1"
--- ns4.p26.dynect.net
"9.6.1-P1"
どうハイジャックされたのかわからないけど、もしや bit.ly (の A RR)が書き換えられててもおかしくなかったのかな、と想像。BIND の事情よくわからんし、攻撃手法がわからないとなんとも・・?
外から動的更新できる設定でした、なんてぇことはないだろうしなぁ。

2009年12月12日土曜日

そういえば FreeBSD 8.0-RELEASE

でてたなぁ。

おうちのとあるマシーンはこないだまで 8.0-CURRENT だったので、タグが打たれた時点で csup を使って RELENG_8 なソースを取ってきて make buildkernel buildworld 〜〜 をして、8.0-STABLE にしてた。

おうちの環境で buildkernel buildworld する時は -j8 が最速っぽいので最近は常に -j8。最速、っても35分ちょっとかかるのだけどね。

Xen DomainU やら階層型 Jail やら、いろいろ楽しそうなものはある。ここんとこそれどころではないので落ち着いたらお触りしてみようかなぁ。

virtualization.info にも載ってたのか
FreeBSD 8.0がついにXen domUを(試験)サポート(20091204-2)
32ビット限定。

2009年12月8日火曜日

もでる

mixi のエコーで、どうやら小中学校が同じだった子がモデルになってたらしいことを知る。
誰かなーとぐぐってみたら、すぐ見つかった。

・Wikipedia にしっかり載ってた(「〜〜県出身の人物一覧」なとこでまず発見)
・所属事務所のサイトにしっかり載ってた
・顔ちっさ!
・雑誌のインタビューみたいなのもあった
・大手企業のCMにもでてた
・ミュージックビデオにも
・ブログを書いてる、もちろん(?)アメブロ

いやぁ、驚いた。

記憶がたしかならば小学校 1,2年と 5,6年で同じクラス。中学の時は一度も同じクラスにならず。
んで、高校は市外の女子校にいってたハズ。(いまみたら、2005年4月に共学化してた。)

2009年12月5日土曜日

ある日の SunSpider 結果

JavaScript 以外のベンチを取ってみたいとふと思ったのだけど、、よくわからず。

SunSpider JavaScript Benchmark

手元の環境(Mac)で3回実行した結果。Total だけコピペ。
最速の Safari は nightly の Webkit を利用したもの。

Safari 4.0.4 (6531.21.10, r51708)
Total: 370.6ms +/- 1.2%
Total: 356.8ms +/- 1.5%
Total: 373.2ms +/- 1.1%

Safari 4.0.4 (6531.21.10)
Total: 424.4ms +/- 3.2%
Total: 424.0ms +/- 1.0%
Total: 427.8ms +/- 1.5%

Chrome 4.0.249.22
Total: 435.6ms +/- 0.8%
Total: 447.0ms +/- 5.0%
Total: 437.4ms +/- 1.3%

Firefox 3.5.5
Total: 1038.6ms +/- 0.8%
Total: 1042.6ms +/- 1.8%
Total: 1040.4ms +/- 1.3%