2009/04/18

post content-type

ActiveResource を少しずつ勉強してるんですが
REST っていうのは XML でのやりとりを想定してるんですかね
接続先によっては XML を吐くけで受けつけてはないとかあって

activeresource-2.3.2/lib/active_resource/base.rb だと
      # Create (i.e., \save to the remote service) the \new resource.
def create
connection.post(collection_path, encode, self.class.headers).tap do |response|

なんだけどこの self.class.headers に
{"Content-Type"=>"application/xml"}

が入ってるともぉ涙目。
ググって何入れればいいか捜して
{"Content-Type"=>"application/x-www-form-urlencoded"}

を渡してあげることにしました。

既に ActiveResource 使うメリット無くって
もう少し手軽に proxy だか middleware 的なもの作った方が早いんではという気分に

それにしても気付けたのは logger のおかげで
debug の知識ってのが無いと本当に大変だなぁ
Hellow, World とかできるようになったら後は debug の知識積むだけっすよ、ほんと

2009/04/17

zoho creator "null date"

Creator で View の filter を定義するのに
Date な項目が空のを捜そうとしたら方法が分からなくて検索
試行錯誤の末に見付けたのが How To Create a NULL Date Field

つかまぁ、別に答が載ってたんじゃないんだと思うんだけど (ちゃんと読んでない)
null って単語を見付けてそうかと思って "== null" みたいなことしたら OK だった
でも View をいじるところから filter を追加しようとすると null は怒られて
Script なところから View に手書きで filter を足してあげないといけませんでした

"配列からハッシュを"

配列からハッシュを作りたいと思いました、Ruby で
そんなことは検索しなくても本家のドキュメント見ればいいんだな
ってのが結論でした

Ruby だったら Hash - Rubyリファレンスマニュアル
{"one"=>2, "two"=>3}
Hash["one", 2, "two", 3]
Hash[*[["one", 2], ["two", 3]].flatten]
Hash[*["one", "two"].zip([2, 3]).flatten]

* とか使わないとなのね

Python だったら 6. Built-in Types — Python v2.6.2 documentation
{"one": 2, "two": 3}
dict(one=2, two=3)
dict((('one', 2), ('two', 3)))
dict(zip(('one', 'two'), (2, 3)))

ん〜、ちょっと素敵

Perl だったら、ん〜、Perl 分からないから対応したものが書けない
でも、 確かに
@hash{("one", "two")} = (2, 3);

はちょっと格好いいかなぁ、これ、無名でもできるんでしょうか??

2009/04/16

SSLCipherSuite

Apache の mod_ssl 関連の設定で SSLCipherSuite ってのがあります。
ググりました。
akr流(2006-02-04)が最初にひっかかって
知りたいこと大体書いてあるっていう素敵 blog でした。
でも良い子は mod_ssl - Apache HTTP Server も見ないといけませんね。
暗号の基礎の勉強なら新版暗号技術入門がとっても分かり易いんですが
運用となると Apacheハンドブックとか OpenSSL とか読んで勉強すべきでしょうか...。



これは SSL/TLS 張るときに使う暗号関係のアルゴリズムのリストを指定しまして、
openssl の ciphers ってコマンドで見れます。
デフォルトだと
$ openssl ciphers -v | sort
AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1
DES-CBC-MD5 SSLv2 Kx=RSA Au=RSA Enc=DES(56) Mac=MD5
DES-CBC-SHA SSLv3 Kx=RSA Au=RSA Enc=DES(56) Mac=SHA1
DES-CBC3-MD5 SSLv2 Kx=RSA Au=RSA Enc=3DES(168) Mac=MD5
DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1
DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1
DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1
DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1
DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1
EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH Au=DSS Enc=DES(56) Mac=SHA1
EDH-DSS-DES-CBC3-SHA SSLv3 Kx=DH Au=DSS Enc=3DES(168) Mac=SHA1
EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH Au=RSA Enc=DES(56) Mac=SHA1
EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1
EXP-DES-CBC-SHA SSLv3 Kx=RSA(512) Au=RSA Enc=DES(40) Mac=SHA1 export
EXP-EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH(512) Au=DSS Enc=DES(40) Mac=SHA1 export
EXP-EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH(512) Au=RSA Enc=DES(40) Mac=SHA1 export
EXP-RC2-CBC-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export
EXP-RC2-CBC-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export
EXP-RC4-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export
EXP-RC4-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export
RC2-CBC-MD5 SSLv2 Kx=RSA Au=RSA Enc=RC2(128) Mac=MD5
RC4-MD5 SSLv2 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5
RC4-MD5 SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5
RC4-SHA SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=SHA1

っていうのが有効になってます。
何を表してるかっていうと
「名前 SSLのバージョン 鍵交換の方法 認証方法 通信の暗号化方法 メッセージ認証のハッシュ」

$ openssl ciphers -v 'ALL' | sort

ってすると使える全ての Suite が列挙されます

! で「それ以降で選択されても出ないようにする」っていう強い拒否なので
EXP: 米国で輸出規制があった頃に輸出できた暗号強度?
ADH: 匿名 Diffie-Hellman 鍵交換 (って何?)
LOW: 56bit とか 64bit とか小さな暗号強度のもの
SSL2: SSL2
辺りを使わないようにしてみると
$ openssl ciphers -v 'ALL:!EXP:!ADH:!LOW:!SSLv2' | sort
AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1
DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1
DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1
DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1
DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1
DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1
EDH-DSS-DES-CBC3-SHA SSLv3 Kx=DH Au=DSS Enc=3DES(168) Mac=SHA1
EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1
RC4-MD5 SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5
RC4-SHA SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=SHA1
中々絞れてるかな。

ん〜、完璧主義者なら MD5 も外すべきかなぁ。

2009/04/15

"class << self"

そもそも << って何だか覚えてなかったんだけど
検索すると特異クラスとか特異メソッドとかいうらしい
そうそう Ruby はオープンクラスとかいって
まつもと直伝 プログラミングのオキテ 第21回 オープンクラスとRuby on Rails
クラスとかインスタンスに後から色々追加できるんでした

にしても Google の検索は "<<" だけはひっかけないし
"class <<" でも "<< self" でも << が無いような結果しか出さないくせに
"class << self" だと色々ひっかけてくれるという不思議仕様
や、仕様が良く分かってないだけなんでしょうか、むむむん

で、"class << self" っての自体は class method の追加の際に使われるようですが
[ruby-dev:12277] Re: class << self
自クラスで定義されている定数以外は、そのネストの外側のクラス
/モジュールで定義されている定数か、スーパークラスで定義され
ている定数しか見えない

ってことは class << self で呼ばれてる class は何??

で検索してたら次を発見
id:m-hiyama:20080109:1199863428 を Ruby で - sumim’s smalltalking-tos
おー、何じゃこりゃ
メタクラスに出会って困惑することとなってしまいました
Ruby の 1.8 と 1.9 でも挙動違うみたいだし

クラスもオブジェクトなのでクラスのメタクラスもあって
そこにクラスメソッドが住んでるってことかな??

2009/04/14

python time 速度

処理に掛かってる時間を測りたいときってのはありますが
直前に時刻を取って終わってから差を取れば大体分かります
import time

n=100000

start = time.time()
xrange(n)
print time.time() - start

start = time.time()
range(n)
print time.time() - start

start = time.time()
for i in xrange(n):
i
print time.time() - start

start = time.time()
for i in range(n):
i
print time.time() - start

start = time.time()
for i in range(n):
str(i)
print time.time() - start

まぁ、こんなことして楽しいのかと言われると困るんですが