忘れたときに備えた記録

トップ 最新 追記
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2008-05-06(Tuesday)

pendingはどこへ行った

specファイルに空のitメソッドを書きまくっていたのを何とかしようと思って気がついたのですが、specコマンドの出力では、pendingが何行目にあるかが表示されないんですね。

それで、pendingになっているサンプルの行、具体的には

  • itだけの行
  • it "comment"な行

に該当する行の行番号を表示するRakefile用の処理を作ってみました。

task :pending do
   grep = `grep -ERn "^[[:space:]]+it([[:space:]]+|$)" *`.split(/\n/)
   puts grep.select{|i| i !~ /\s+do\s*\Z/}
end
Tags: RSpec

一部だけテスト

specには -l オプションがあって、これに行番号を指定するとその行(の周辺)のサンプルだけを実行します。 しかし、作業中にあるテストだけ試したいときに、いちいち行番号を調べてファイル名を指定して

$ rake SPEC_OPTS=-l100 SPEC=spec/hoge/fuga/foo/bar/test_spec.rb

なんて書いていられません。

そこで、specファイル中に

it "hoge" do # spec_here

てな具合に "spec_here" とコメントを書いておいて、それを勝手に見つけてその部分だけ実行するような処理を作ってみました。こっちもRakefile用です。

   `grep -Rn spec_here spec`.split(/\n/).each do |l|
      next unless l=~/\A(.*?):(\d+):/
      file = $1
      line = $2.to_i
      Spec::Rake::SpecTask.new(:here) do |s|
         s.spec_files = file
         set_spec_opts(s)
         s.spec_opts << "-l#{line}"
      end
   end

同じスペックファイルに複数の spec_here コメントがあると、それぞれ別の(同じ'here'という名前の)タスクになってしまいますがそこはご愛嬌ということで。

Tags: RSpec

2008-05-11(Sunday)

構造体の名前

構造体の名前は、リファレンスマニュアルによると

名前の無いクラスは最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。

とありますが、特異クラスの中で作った定数はその名前には使われないようです。

class << Object.new
   $s = Struct.new(:v)
   $s.name # => ""
   S1 = $s
   $s.name # => ""
   module Mod
      S2 = $s
      $s.name # => ""
   end
end
module Mod
   S3 = $s
   $s.name # => "Mod::S3"
end

S4 = $s
$s.name # => "Mod::S3"
Tags: Ruby

xmpfilter in rcodetool

「"# =>" をソースに埋めておくとその行を評価した値を追記してくれるツール」というのを以前どこかで見た記憶があったのに記録していなかったので改めて探しました。

Ruby 1.8とRuby 1.9の変更点チェック - ’(rubikitch wanna be (a . lisper))で紹介されているxmpfilterがそれでした。

Tags: Ruby

クラス構造についての勘違い

最初に「クラス」を覚えたのがC++とDelphiだったからだと思うのですが、Rubyのクラスの構造について勘違いしていた事がありました。

あるクラスのインスタンスをMarshal.dumpで保存して、その後、バージョンアップによりクラスの構造が変わった場合、古いバージョンのMarshalデータをMarshal.loadしたら、何か問題が起こるだろうか?と考えたのです。

dump.rb

#!/usr/bin/ruby
class Test
   def initialize
      @rest = "rest"
      @delete = "delete"
   end
end

puts Marshal.dump(Test.new)

load.rb

#!/usr/bin/ruby
class Test
   def initialize
      @rest = "hoge"
      @add = "add"
   end
end

p Marshal.load($<)

で、実行

$ ./save.rb |./load.rb 
#<Test:0xb7cea9c0 @delete="delete", @rest="rest">

何の問題もなく、元のメンバ変数の組み合せでオブジェクトが復元されています。

この結果についてもやもやと考えて気がついたのですが、C++やDelphiではクラスのメンバ変数が固定されて事前に定義されているのに対して、Rubyのクラスの構造は流動的です。

例えば、こんなコードもありなわけです。

#!/usr/bin/ruby
class Test
   def initialize
      @v = 1
   end

   def hoge
      @hoge = "HOGE"
      self
   end

   def fuga
      remove_instance_variable(:@v)
      self
   end
end
o = Test.new # => #<Test:0xb7c3e008 @v=1>
o.hoge # => #<Test:0xb7c3e008 @hoge="HOGE", @v=1>
o.fuga # => #<Test:0xb7c3e008 @hoge="HOGE">

つまり結論としては、古いMarshalデータをMarshal.loadしても、新版で追加したインスタンス変数がnilになって古いインスタンス変数が残っているくらいで、何も問題は起きないといったところでしょうか。

逆に、initializeで定義しているからといって、そのインスタンス変数がいつまでも存在しているとは限らない訳です。

Tags: Ruby

URIライブラリでエラーになるURL

この日記に来ているリファラで、次のようなURLがあるのですが

http://www.google.co.jp/search?q=debian+postfix+AUTH+sasl&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls={moz:distributionID}:{moz:locale}:{moz:official}

次のように、URI.splitで処理しようとするとエラーになります。

~$ ruby -r uri -e "URI.split('http://www.google.co.jp/search?q=debian+postfix+AUTH+sasl&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls={moz:distributionID}:{moz:locale}:{moz:official}')"
/usr/lib/ruby/1.8/uri/common.rb:436:in `split': bad URI(is not URI?): http://www.google.co.jp/search?q=debian+postfix+AUTH+sasl&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls={moz:distributionID}:{moz:locale}:{moz:official} (URI::InvalidURIError)
        from -e:1

「{」や「}」や「:」がエスケープされていないのが原因なのですが、実際にこんなリファラが来てしまうので、tDiaryのspambayes.rbのリファラ処理には、URIライブラリを使っていないのです。

Tags: Ruby

2008-05-13(Tuesday)

tDiaryのUTF8化

ここのサーバーで使っているtDiaryをCVS-Trunkの物に変えて、UTF8化してみました。

その準備として、SpambayesフィルターとXHTML化キットのUTF8版を作りました。というわけで...

Tags: tDiary

Spambayesフィルタのバージョン 2008.05.13 を公開しました

こちらからダウンロード出来ます。

tDiary-2.2からCVS-Trunk版に乗り換える場合は、Spambayesフィルタも「Trunk(UTF8)用」となっている方を使ってください。

今までtDiary-2.2(EUC)でも使っていた場合は、判定用のデータベースや投稿データのキャッシュは自動的にUTF-8に変換されるはずです(変換するのはフィルタで使っているデータだけなので、日記本文などのデータはmisc/migrate.rbを使ってください。どちらが先でも大丈夫なはずです)。

tDIary-2.2(EUC)用の方は、とくに修正点はありません。

tDiary XHTML化キット のバージョン0.21を公開しました

ダウンロードはこちらからどうぞ

tDiary-2.2で使うEUC版と CVS-Trunkで使うUTF8版があるので、ご自分の環境に合わせてダウンロードしてください。

主な変更点は

  • 同梱したMathMLライブラリを最新版に更新
  • tDiary CVS-Trunk用のUTF8版を作成

の2点です。


2008-05-14(Wednesday)

gpgの署名の検証

時々調べなおしてはまた忘れてしまうので、今更ながらにメモします。

今回のお題は Debian -- Security&nbsp;Information -- DSA-1571-1 openssl で公開されている http://security.debian.org/project/extra/dowkd/dowkd.pl.gz

参考になったのは GPGで署名確認 | Linux - P-SOCです。

手順

目的のファイルをダウンロードする

$ wget http://security.debian.org/project/extra/dowkd/dowkd.pl.gz

署名ファイルもダウンロードする

$ wget http://security.debian.org/project/extra/dowkd/dowkd.pl.gz.asc

とりあえず署名の検証を実行する

$ gpg --verify dowkd.pl.gz.asc
gpg: Signature made 2008年05月13日 23時09分19秒 JST using RSA key ID 02D524BE
gpg: Can't check signature: public key not found

公開鍵がないと怒られるので取得する。鍵サーバーの後で鍵IDを指定しないとエラーになる。

$ gpg --keyserver pgp.nic.ad.jp --recv-keys 02D524BE
gpg: requesting key 02D524BE from hkp server pgp.nic.ad.jp
gpg: key 02D524BE: duplicated user ID detected - merged
gpg: key 02D524BE: public key "Florian Weimer (HIGH SECURITY KEY) <fw@deneb.enyo.de>" imported
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

署名を検証して終わり。

$ gpg --verify dowkd.pl.gz.asc
gpg: Signature made 2008年05月13日 23時09分19秒 JST using RSA key ID 02D524BE
gpg: Good signature from "Florian Weimer (HIGH SECURITY KEY) <fw@deneb.enyo.de>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: C8D3 D9CF FA9E 7056 3F32  FA54 BF7B FF04 02D5 24BE

署名はあってるけど信頼してない鍵を使っているせいで怒られる(つД`)

Tags: メモ