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 にあればそれで済むのだけど、無い。
後で分かったけど、 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.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 のパッチ当てるとよい?

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 のオプション等がよろしくないのか?

見直しし判明。最適化だった模様。
前述の 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付属のは -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月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.ly や 37signals がある。

というわけで 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 の事情よくわからんし、攻撃手法がわからないとなんとも・・?
外から動的更新できる設定でした、なんてぇことはないだろうしなぁ。