thinを試そうと思ったらOSX 10.7のabコマンドがぶっ壊れていた

背景

いろいろ開発環境がヘボいので少しでも良くなるかなと素振りとして自分の OSX 10.7 環境で thin を試してみようと思った。(これは先週の meetup #2の成果の一つでもある。)

ちなみに Rails 3 では(もしかしたらそれ以前から)は Gemfile に

gem 'thin'

しておくだけで rails server で WEBrick ではなく thin が立ち上がる。楽すぎる。

ベンチとろうとしたら

OSX 10.7 の環境で

clientlocalhostのab
serverlocalhostの(thin|WEBrick) + Rails

という方法でベンチマークを取ってみたところ、

なんと、WEBrickの方が速い。

なんじゃこれと思ってアレコレ悩んだんだけど、ログをよく見ると

thin が ab で指定した数より大量にrequestを捌いていた

ことが判明。はい?

何が起きていたか

つまりこうです。

thin速い
ab壊れてる

悩んだ時間返せ。

これの解消のためには

  1. ab を入れ直す(つまり apache を入れる)
  2. ab じゃないベンチマークツールを入れる

の二択になりますね。

httperf入れてみた

せっかくなので以前から名前だけ知ってた

Welcome to the httperf homepage

を入れてみることにした。インストールは brew install しただけ。で、実際ちょっと試してみたんだけど、

  • option が多すぎるし長すぎるし
  • URL をスパッとコピペで渡せないし

手作業で常用するにはやや面倒な感じ。ab の方が慣れもあるけど簡単に使える。とは言え、選択肢があると今回のようなことがあっても安心なので使えて損はない。

rubyops/httperfrb

こんなんもあって、Ruby から使うという方法もあるけど、option が Hash になっただけのような…。それでもまぁ抽象化されて設定ファイルとして ruby コードに落とせるだけでもマシ、かな?

Last-Modified と HTTP date と RFC 1123

API だの Feed だので盛り上がっている wtnabe です。

今日は先日の ETag の話に続いて client 側での cache に使える Last-Modified response header のお話。

サーバサイドで各種スクリプトを動かす場合、HTML そのものは cache してほしくない場合が少なくありません。

……。ということにしてください。

実は Last-Modified はほとんど意識したことがありませんでした。ですが API や feed の場合は基本的に生のデータをそのまま提供する形になるし、ブラウザからの自サイトへの直接のアクセス以外にも様々な利用が可能なので、ネットワーク帯域やサーバの負荷を抑えるためにできることはいろいろ細工しておきたいものです。

ということで本題。

cf. [Studying HTTP] HTTP Header Fields

このヘッダの値は HTTP date という名前で定義され、以下のようなルールになっています。

  1. RFC1123 スタイルの固定長の表記が好まれている(送出はこれにしなければならない(MUST))
  2. それ以外も含めて3つの表記をサーバ、クライアントともに受け入れなければならない(MUST)
  3. すべての HTTP date/time stamp は例外なく GMT で表現されなければならない(MUST)1

ちなみに RFC1123 の日時表記が RFC822 と違うのは

  • 年は4桁の数字で表現すべき(SHOULD)
  • timezone の名前ではなく時差を数字で表現すべき(SHOULD)

ということらしいです。

ということは timezone の名前は管理する必要ないですね。よかったよかった。

  1. リンク先は誤訳でしょう。without exception は「例外を除いて」ではなく「例外なく」になるはずです。 

Yet Another Geekmonkey

Geekmonkey userscript injector

去年から個人的には Camino + Geekmonkey の環境で幸せに暮らしているんだけど、これを IE で再現しようとして躓いた。

課題はいくつかあって、

  • オリジナルの Geekmonkey ブックマークレットスクリプトは IE 6 では長過ぎて動かない。
  • [ this bookmarklet ] を使ってブックマークレット化したスクリプト内(伝わりますか?)で "var s=" として解釈してほしい "var%20s=" の部分でエラーが出る
    • 動くんだけど必ずエラーが出る1
  • doIt() とか void() とか定義がないので怒られる

というわけでこれらを全部解決したものを以下のリンクに置いておきます。(Fastladder だとリンクになりませんね。feed リーダはそういう仕組みになってるの多いのかも?)

<a href="javascript:(function()%7Bfor(var%20i=0;i%3Cdocument.links.length;i++)%7Bvar%20a=document.links%5Bi%5D;if(a.href.indexOf(‘.user.js’)%3E0)%7Ba.href=%22javascript:(function()%7Bs=’%22+a.href+%22’,t=’text/javascript’,d=document,n=navigator;(e=d.createElement(‘script’)).src=s;e.type=t;d.getElementsByTagName(‘head’)%5B0%5D.appendChild(e)%7D)();%22;with(a.style)%7Bborder=%222px%20groove%20%23000%22;padding=%220px%205px%202px%22;backgroundColor=%22%23ddd%22;color=%22black%22;%7D%7D%7D%7D)()">this bookmarklet</a> </div>

使い方は本家と同じです。

※ 念のため Firefox でも確認しましたがちゃんと機能しているようです。

ところで IE ってリンクツールバーっつうんですか、ここに DnD ってできないっぽいですね。最初どうすんだか分からなくて悩みました。

なぜ Geekmonkey にこだわっているかというと、localhost にスクリプトを保存してしまうタイプだとアップデートが面倒だからです。自分一人で使うだけならどうだっていいことだけど、複数の人に使ってもらおうと思うとこの Geekmonkey のアプローチはなかなか魅力的なのです。キャッシュをクリアするだけでアップデートできるんだもの。

  1. 他にも % 表記の部分はあるのに、なぜここでだけ引っかかるのかは不明 

SUNTORY PREMIUM MALT'S

最近やっと知った。何せ金沢で売っているお店は自分のテリトリー内にはないので。

かなりうまかったので今度からこれにしてみようかな。手に入れば。

Apache 1.3 で転送できる最大サイズ

Apache 1.3 on OSX(not Xserve) では 2GB を越えるファイルの転送はできないらしい。

LimitRequestBody 0

にしてもダメだった。ファイルシステムは 2GB の制限を受けないので、Apache そのものの制限か、OSX 用の何かのモジュールか、コンパイルオプション(そんなのあったかな)か何かの影響かもしれないけど、考えるの面倒になったので

split -b 2000m

して対象ファイルを分割して対処。

以下はその他も含めてテスト結果。Apache は apt-get か ports で素直ぉーに入れたもの。

WebサーバOSファイルシステム結果
Apache 1.3.33OSX 10.3.9HFS+×1
Apache 1.3.33FreeBSD 4.11RUFS
Apache 1.3.26Debian 3.0Reiser32
Apache 2.0.54Debian 3.1ext3×3

よぐ分かんねぇ。ports で入れたものは普通に動いているので Apple バイナリ、Debian バイナリが何か手を加えられているんじゃないかと疑っているんだけど。気分が乗った人は追試してみてください。

なんでそんなでかいファイルを転送したかったかというと、DVD-R ドライブを積んでいない Mac で DVD の iso イメージを作って、それを DVD の焼ける Windows マシンで焼こうと思ったからなんですが。普通にその Windows マシンで焼くとイメージの作り方が Windows 前提で、ちょっと嬉しくないことが起きたりするので。SMB/CIFS でええやんという指摘はごもっとも。でもなんとなく「HTTP の方が軽いかもしんない」と思ったので。

外付けのドライブ買うのがいちばん簡単なんだよなぁ。

※ 結局、Mac で作ったイメージ(「CD/DVDマスター」に変換したもの)を Windows や Linux でマウントできないことが判明。いったいなんだったんだorz CD は iso9660 で焼けるのに DVD はできないのか? (とりあえず 10.3 では mkisofs -udf するしかないっぽい。)

参考

容量指定のダミーファイルを作成したい

  1. コンテンツの長さが 386MB で切れる 

  2. コンテンツの長さが返ってこないが、転送そのものはできる。ただしクライアントが長さの検出ができずに転送終了後もずっと働き続けたりする。 

  3. forbidden 

PukiWiki 1.4.4 で CSS 非対応、あるいは対応がダメなブラウザを弾く

array(

 'pattern'=>'#(Mozilla/[1-3])|(Mozilla/4\.([^0]|0[^\s]|0 \[))|w3m|\iCab#',
 'profile'=>'nocss'),

を pukiwiki.ini.php の $agents に追加。で、nocss.ini.php を作成して、nocss.skin.ja.php に渡す。

以前は

(Mozilla/[1-3])

(Mozilla/[1-3]\)

でも動いていたんだけど、PHP を上げたからか PukiWiki が上がったからか、動かなくなった。

Gnu arch ステキだ

チュートリアルを適当に読んでみた程度なんだけど、これはかなり素敵な気がする。とりあえず目についた範囲で気に入った点は

  • file system 上で動く
  • archive という名前で repository を扱うのだが、これを手軽に mirror できる
    • つまりオレ archive にすぐ fork できるし、オリジナルに戻すのもそんなにしんどくない
  • むしろ積極的に archive を分けることが推奨されている
    • 例えば年や月という識別子を入れて archive を分ける
    • これは短期プロジェクトベースの開発業務にものすごく向いている気がする
    • 開発じゃなくたって向いているだろう
  • 対応しているネットワークプロトコルは
    • ftp
    • sftp
    • http
    • WebDAV
  • ファイル名とは別に ID を持っているので rename に対応できる
  • 多くのファイルを commit したい場合、グループ化して commit できる

辺りか。

http://senri.homelinux.com/jtla/pukiwiki.php

に翻訳や独自ドキュメントがある。追って確認すべし。

fink, ports には収録されているのでインストールは簡単。

About

例によって個人のなんちゃらです