雑記

2000|01|
2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|
2007|01|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|09|11|
2009|02|03|05|06|07|08|10|11|12|
2010|01|03|04|05|06|07|08|09|10|
2011|05|06|09|10|
2012|03|07|09|12|
2013|01|02|04|05|07|08|10|11|
2014|04|05|08|10|12|
2015|01|05|
2016|09|
2024|06|
2025|01|

2010-10-01 [長年日記]

[Ruby][Sinatra] Sinatra+WEBrickでSSLを使う方法 - もしくはRack::Handlerに任意のオプションを渡すためのパッチ -

WEBrickはSSLに対応していますが、Sinatraから利用する方法を探しても見つからなかったので、ソース見てモンキーパッチを書いてみました。

ソース:base_ext.rb

上記ファイルを$LOAD_PATHの通っている場所に保存してアプリのコードに以下を追加します。

$LOAD_PATH.unshift './lib'  # ./libにbase_ext.rbを保存した場合
require 'base_ext'
 :
set :server, "webrick"
set :rack_handler_options, {
      :SSLEnable   => true,
      :SSLCertName => [ [ "CN", WEBrick::Utils::getservername ] ],
    }

これでアプリを実行すれば、オレオレSSL証明書を自動生成してアプリケーションが起動します。

% ruby start.rb
== Sinatra/1.0 has taken the stage on 4567 for development with backup from WEBrick
[2010-10-02 01:12:06] INFO  WEBrick 1.3.1
[2010-10-02 01:12:06] INFO  ruby 1.8.7 (2009-12-24) [i386-freebsd7]
............++++++
.....++++++
[2010-10-02 01:12:06] INFO
Certificate:
    Data:
        Version: 4 (0x3)
        Serial Number: 0 (0x0)
        Signature Algorithm: sha1WithRSAEncryption
 :
[2010-10-02 01:12:06] INFO  WEBrick::HTTPServer#start: pid=38059 port=4567

起動後、https://sample-host:4567/ にアクセスすると、SSL証明書の警告が表示されます。オレオレ証明書は起動のたびに生成されるので、Firefoxでうっかり保存すると2回目以降証明書エラーでまったくアクセスできなくなります。そうなったらSinatraアプリの起動時に表示されるSSL証明書のCNを見て、該当する証明書を削除します。

発行済みの証明書を利用したい場合は、:rack_handler_optionsを以下のように修正します。

ssl_crt = open('path/to/server.crt').read
ssl_key = open('path/to/server.key').read

set :rack_handler_options, {
      :SSLEnable   => true,
      :SSLCertificate => OpenSSL::X509::Certificate.new(ssl_crt),
      :SSLPrivateKey  => OpenSSL::PKey::RSA.new(ssl_key),
    }

その他、WEBrick::Config::SSLWEBrick::Config::HTTPに書いてあるオプションを指定することもできるはずです。

解説

.../gems/sinatra-1.0/lib/sinatra/base.rb の946行目の

handler.run self, :Host => bind, :Port => port do |server|

と言う行を

handler.run self, { :Host => bind, :Port => port }.merge(rack_handler_options) do |server|

と書き換え、ハンドラに渡されるオプションをマージするようにしただけです。

ちなみに、

set :server, "webrick"

を消して試しにMongrelで起動するとちゃんと無視してくれました。 Rack::Handlerのソースを読む限りはThinでも副作用は無いと思います。


2010-10-29 [長年日記]

MacBook Air検討

半年前に買ったLOOX Uが私の使い方には合わず埃をかぶっており、買い替えを検討中。先日Let's Note J9が発表され、かなり心揺れてたんだけど価格面がネックになり手が出せずにいたところに登場したMacBook Air。正直まったく気にかけていなかったんですが、あちこちのレビューを見ているとすこぶる評判がよくかなり欲しくなりました。

モデル

持ち運び前提なので11インチ

CPU

一番悩んだ選択。あちこちのレビューを見る限り1.4GHzで大丈夫そうだが、目的のひとつがLCD-10000Uによるどこでもデュアルディスプレイ環境の実現だったので、1.6GHzを選択。

SSD

一番気になるところ。

ウェアレベリングなどが理想的として単純化すると、SSDの寿命は累積書込量が(容量 x 書換可能回数)に到達したときとなる。単純計算で64GB x 1万回とすると、寿命到達までの累積書込量は640TB、これは毎日350GB書き込んでも5年以上もつ計算となり、十分と思われる。

ただし、今時の使い方ではブラウジングによるキャッシュ量の方がユーザによる明示的なファイル保存量をはるかに超え、思っている以上のペースで日々寿命が削られていくはず。swap out/inもそのペースに拍車をかけるだろう。また上記理想的なウェアレベリングの実現にはファイルシステム上のスタティックなデータの移動も必要となる(スタティック・ウェアレベリング:下記Tech-onの記事参照)ため、ハードウェアレベルではOSからのリクエスト以上の量の書込み(書換え)処理が発生するはずである。この処理はSSDの残り容量が少なくなるほど増え、寿命への影響だけではなくswap in/outの際のパフォーマンス低下にもつながるだろう。つまり、残り容量が少なくなるほど劣化やパフォーマンス低下が顕著になると考えられる。

もう一点気がかりなのがSSDの壊れ方。磁気ディスクの場合、基本的に一度書き込まれたデータは書きっぱなしであるのに対し、SSDでは上にも書いたようにウェアレベリングによるデータの移動が発生し、業界の不文律である「動いているものに触るな」という原則を破っている。つまり、SSDの場合、壊れかけのセルに対してカーネルやライブラリなど、読み込めなくなるとシステムの稼動に致命的な打撃を与えるデータを載せてしまう可能性を排除できず、理屈上は偶然そうしたセルに当たってある日突然起動しなくなった、なんてことになりかねない。これを避けるためにソフト(OS)とハード(SSD)が連携するような仕組みになっていれば良いのだが、サードパーティから早々に換装用SSDが発表されたところを見ると、その望みも薄い。そうすると、容量を大きくしてウェアレベリングによるデータの移動回数をなるべく減らす、というのは案外有効かもしれない。

というわけで、128GBを選択

;参考

Tech-on:[[HDD完全代替に向けてOSによる対応が急務|http
//techon.nikkeibp.co.jp/article/FEATURE/20090219/165972/?ST=lsi]]
元麻布春男の週刊PCホットライン:[[SSDの寿命|http
//pc.watch.impress.co.jp/docs/column/hot/20090420_127747.html]]

メモリ

SSDの項で検討したようにswap outはしないに越したことは無い。またメモリ使用量に余裕があり、もし標準でそうなっていないなら/tmpもmemory disk化したい。よって4GB

って、結局のところ全部のせだw。

その他

;キーボード

とうぜんUS

;添付ソフト

とりあえずiWorkを試してみる

;AppleCare Protection Plan

SSDって保証範囲内扱いなのかちょっと不明だし、[[保証期間内であればいつでも購入可能|http
//www.apple.com/jp/support/products/faqs.html]]で、B002V0UGG0ので後回し

;ディスプレイアダプタ

純正品のDVIアダプタはDVI-Iケーブルを使えない、VGAアダプタは[[ネジが届かない|http
//store.apple.com/jp/product/MB572Z/A]]など、レビューが散々なのでやめ。PLANEXのB0037HP7VUやB0037HP7W4の方が安いしよさそう。

;有線LAN

PLANEXの[[UE-200TX-G2|http
//www.planex.co.jp/product/adapter/ue-200tx-g2/]]に白があれば確定なんだけど。純正品かな。

移行準備

;Firefox, Thunderbird

そのまま

;ターミナル

screen(1)とvim(1)を組み合わせて利用するケース」にもろに当てはまる人なので、[[iTerm2|http
//code.google.com/p/iterm2/]]かな

;Windows環境

リモートデスクトップはRemote Desktop Connection Client 2を使えばよさそう。ローカルに入れるなら[[VMware Fusion 3|http
//www.vmware.com/jp/products/fusion/]]あたりか。

;その他アプリ

[[MacPorts|http
//www.macports.org/]]?

(おまけ) Let's Note J9との比較

Core i5-460M,メモリ2GB, SSD 128GBという店頭用モデルが15万弱だが個人的には必須のBluetoothが付いていない。MyLets倶楽部限定モデルはBluetooth付きだが、SSD付きはプレミアムエディションの27万円〜とちょっと手が出ない価格。ジャケットがダサい。両方とも下取りキャンペーン中だがLOOX Uの参考買い取り上限価格が1/3しかない。

その他:10.1"液晶(-)、有線LAN(+)、SDXC(+)、標準VGAコネクタ(+)、バッテリ駆動時間(+)、日本語キーボード(-)

店頭モデルを触って比較した感じでは、やはりSSDのおかげかシャキシャキ感が違う。Airがなければ間違いなく第一候補なんですが。

----[green]