2001-04-06 (Fri) [長年日記]
_ make
最近はコマンドのメッセージの国際化が進んでいて便利になったが、 同僚は次のような屈辱的なメッセージを受け取ったらしい。
$ make Makefile:2: *** 分離記号を欠いています (8 個の空白でしたが、TAB のつもりですか?). 中止。
「その通りです。ごめんなさい。」
2001-04-09 (Mon) [長年日記]
_ 締め日
4月の昇給を期待していたところへ下記のようなメールが。
1. 変更前: 20 日締めの当月 25 日支払い
変更後: 15 日締めの当月 25 日支払い
2. 1 に伴い、4 月分(4月25日支払分)のみ日割計算になります
給与額 × 26/31 = 4 月分給与額
うがー、何か納得行かねー。
2001-04-10 (Tue) [長年日記]
_ mod_ruby
mod_rubyで、Rubyでリクエストハンドラを書けるようにしてcvsにcommitした。
# cat.rb
require "singleton"
class Cat
include Singleton
def handler(r)
begin
body = open(r.filename).read
r.content_type = "text/plain"
r.send_http_header
r.print(body)
return Apache::OK
rescue Errno::ENOENT
return Apache::NOT_FOUND
rescue Errno::EACCES
return Apache::FORBIDDEN
rescue
return Apache::SERVER_ERROR
end
end
end
みたいなスクリプトを書いといて、httpd.confで、
RubyAddPath /home/shugo/ruby RubyRequire cat <Location /cat> SetHandler ruby-object RubyHandler Cat.instance </Location>
なんて設定をしておくと、/cat/以下にアクセスした場合はCat#handlerが呼ばれる。 別にSingleton使わなくても、Object.newして特異メソッド定義するだけでもいいけど。
後は他のハンドラも定義できるようにしなきゃな。
_ mod_rd2html.rb
ちょっと実用的なモジュールをRubyで書いてみたり。 これはRDをHTMLに変換するモジュール。
# mod_rd2html.rb
require "singleton"
require "rd/rdfmt"
require "rd/rd2html-lib"
class RD2HTML
include Singleton
def handler(r)
begin
open(r.filename) do |f|
tree = RD::RDTree.new(f)
visitor = RD::RD2HTMLVisitor.new
r.content_type = "text/html"
r.send_http_header
r.print(visitor.visit(tree))
return Apache::OK
end
rescue Errno::ENOENT
return Apache::NOT_FOUND
rescue Errno::EACCES
return Apache::FORBIDDEN
rescue
return Apache::SERVER_ERROR
end
end
end
たとえば、httpd.confで、
RubyRequire mod_rd2html <Location /rd> SetHandler ruby-object RubyHandler RD2HTML.instance </Location>
なんて設定をすると、http://www.foo.org/rd/foo.rdでfoo.rdをRDに変換した結果が 見られるわけ。 ERbを使うモジュールなんかも簡単にできそうだな。
2001-04-17 (Tue) [長年日記]
_ David Lee Roth
今週のヘヴィ・ローテーションはDavid Lee Roth BandのEAT'EM AND SMILE。 もう15年も経つのか。
_ libwrap-ruby, libchasen-ruby
libwrap-rubyとlibchasen-rubyをdebian.orgにITPした。
_ 予約
明日は歯医者です。どきどき。
2001-04-19 (Thu) [長年日記]
_ ERuby::Compiler
erubyを拡張ライブラリとして利用できるようにした。
require "eruby" file = ARGV.shift || STDIN compiler = ERuby::Compiler.new print compiler.compile_file(file)
erubyは一気に0.9.0にするかな。 (二年もたつのにまだ0.1.3だったのか...。)
_ 渡辺真理
Pythonユーザの7%は渡辺真理を支持しているらしい。
<URL:http://python.friendly.co.jp/html/showPoll.pyp?qid=6842>
Rubyユーザの今井美樹支持率は何%くらいなんだろう。
2001-04-24 (Tue) [長年日記]
_ 末尾再帰
前もやったけど末尾再帰の最適化をRuby 1.7に実装してみた。
<URL:http://www.shugo.net/archive/ruby17-tail-recursive.diff>
末尾再帰の最適化とは、簡単にいうと、
def foo(...) ... return foo(...) end
のような末尾再帰でスタックを食い尽くさないようにすること。
どうやって実現しているかというと、あるメソッド(A)内の最後のメソッドコール(B)では、 Aに戻って来る必要がないことを利用して、Bの前にAの呼び出し前に戻ってしまう、という 方法を使っている。上記のコードでは、return foo(...)という部分でいったんfooの呼び 出し元に戻ってから再びfooを呼ぶので、何回fooを呼んでもスタックを食い尽くすことが ないってわけ。現状ではメソッドコールのたびにsetjmp()するので効率が悪いけど、上手 くやれば改善できると思う。
ところがmake testに通らない。原因は、
def foo
proc {
return "hello"
}.call
end
p foo
みたいなのが
-:3:in `call': return from proc-closure (LocalJumpError)
from -:3
というエラーになること。 最適化でProc#callの前にfooの呼び出し元に戻るので、Procがorphan (みなしご)になっちゃうわけですね。
これは難しいなあ。 orphanなProcからreturnした時は、例外を上げる代りにcontinuationで 元のメソッドに戻ることにするとかいうのは...だめだろうな。
_ 続き
上のバグの対処法を思いついたけど、上手く動かない。 うーん、今日はPC持って帰るか。
2001-04-25 (Wed) [長年日記]
_ 末尾再帰(2)
何とか不具合を解消してmake testは通るようになった。 (CFLAGSに-DTAIL_RECURSIVEを追加されたし。)
<URL:http://www.shugo.net/archive/ruby17-tail-recursive-2.diff>
ところが、今度は次のようなコードで問題が。
def bar
a = 1
return binding
end
eval("p a", bar)
うーむ。
_ 謎のエラー
ずっと次のようなエラーが出るのに原因がわからないシェルスクリプト (実はめったにloginしないホストの.bashrc)があった。
bash: /home/shugo: is a directory
上手く動作しているように見えるのだが、必ず上記のエラーが出る。 しかし何回viで見ても原因がわからない。
ところが今日エラーの原因がわかった。 わかってみれば簡単なことだったんだけど、みなさんは原因がわかりますか? (ヒントは上の文章の中にあります。)
_ 親不知
歯(というか歯茎?)が痛いのは親不知のせいだった。 今週はorphanに苦しむ週らしい。
2001-04-26 (Thu) [長年日記]
_ libwrap-ruby
libwrap-ruby(ruby-tcpwrap)がDebian sidにinstallされてるみたい。